linux部署mongodb及基本操作
一.安裝部署mongo
1.建立資料夾
/opt/mongodb/single
/opt/mongodb/data/db
2.進入single目錄下載安裝包
//下載 tar.gz檔案
wget http://fastdl.mongodb.org/linux/mongodb-linux-x86_64-2.4.6.tgz
3.解壓 並修改檔名
mv mongodb-linux-x86_64-2.4.6 mongo
4.進入mongo目錄
5.建立配置檔案
– mkdir conf
– cd conf
– vim conf.properties
#埠
port=27017
#db存放的目錄
dbpath=/opt/mongotest/data/db
#後臺啟動需要配置日誌輸出
logpath=/opt/mongotest/single/mongo/log/mongo.log
#日誌模式
logappend=true
#設定成後臺啟動
fork=true
6.啟動mongo
mongo目錄執行
./bin/mongod -f conf/conf.properties
啟動mongodb
日誌輸出:
root@chwx2:/opt/mongotest/single/mongo# ./bin/mongod -f conf/conf.properties
about to fork child process, waiting until server is ready for connections.
forked process: 4988
all output going to: /opt/mongotest/single/mongo/log/mongo.log
child process started successfully, parent exiting
表示後臺啟動mongo成功
二.使用mongo進行日常操作
1.連線mongodb
mongo/bin目錄下執行
./mongo
2.檢視資料庫
show dbs
3.檢視當前所在資料庫
db
4.建立資料庫
use openfire (臨時建立 如果不做操作 則離開後被系統刪除)
5.在當前資料庫刪除當前資料庫
db.dropDatabase()
6.檢視當前庫的所有使用者
show users
7.檢視集合(或者叫表)
show collections
8.建立集合
db.createCollection(“mycollection”)
9.建立集合並制定集合的屬性
db.createCollection(“mycol”, { capped : true, autoIndexID : true, size : 6142800, max : 10000 } )
欄位 | 型別 | 描述 |
---|---|---|
capped | Boolean | (可選)如果為true,則啟用封頂集合。封頂集合是固定大小的集合,會自動覆蓋最早的條目,當它達到其最大大小。如果指定true,則需要也指定尺寸引數。 |
autoIndexID | Boolean | (可選)如果為true,自動建立索引_id欄位的預設值是false。 |
size | number | (可選)指定最大大小位元組封頂集合。如果封頂如果是 true,那麼你還需要指定這個欄位。 |
max | number | (可選)指定封頂集合允許在檔案的最大數量。 |
10.另一種建立集合
(當插入一條資料時,不存在mongodb會幫我們建立,和建立資料庫同理)
db.MySecondCollection.insert({“name” : “ming”})
11.刪除當前庫的一個集合
db.CollectionName.drop()
12.插入一條資料
db.MyFirstCollection.insert({“_id”:”3”,”title”:”mongotest”,”description”:”this is test”})
注意:插入的都是JSON形式的,所以一定要用{},否則會報錯:
Sat Mar 19 14:22:39.160 SyntaxError: Unexpected token :
13.插入一條_id存在的資料
db.MyFirstCollection.insert({“_id”:”3”,”title”:”mm”})
輸出:E11000 duplicate key error index: openfire.MyFirstCollection.$_id_ dup key: { : “3” }
解釋:_id即是mongodb的預設主鍵,預設自動生成,我們可以直接設定以達到我們想要的目的
問:插入一條和原來集合完全不一樣的資料可以嗎?
答:可以,所以我們要在程式中規避,手動指定我們一個集合裡面的欄位,否則就無法實現查詢及其他功能了
> db.MyFirstCollection.insert({"newTitle":"null"})
> db.MyFirstCollection.find();
{ "_id" : "3", "title" : "new title", "description" : "this is test" }
{ "_id" : ObjectId("56ecf4fe0dceecace97c4506"), "newTitle" : "null" }
14.檢視集合第一條記錄
db.MySecondCollection.findOne();
輸出:{ “_id” : ObjectId(“56ecde0662552d15c443dd4a”), “name” : “ming” }
15.查詢一條/多條特定資料
db.MySecondCollection.findOne({“name”:”ming”})
輸出:{ “_id” : ObjectId(“56ecde0662552d15c443dd4a”), “name” : “ming” }
16.更新一條記錄
db.MyFirstCollection.update({“title”:”mongotest”},{$set:{“title”:”new title”}},true,false)
結果:
db.MyFirstCollection.findOne()
{ “_id” : “3”, “title” : “new title”, “description” : “this is test” }
update詳解
db.collection.update(criteria,objNew,upsert,multi)
criteria:查詢條件
objNew:update物件和一些更新操作符
upsert:如果不存在update的記錄,是否插入objNew這個新的文件,true為插入,預設為false,不插入。
multi:預設是false,只更新找到的第一條記錄。如果為true,把按條件查詢出來的記錄全部更新。
更新操作符:
1.$inc
用法:{$inc:{field:value}}
作用:對一個數字欄位的某個field增加value
示例:db.students.update({name:"student"},{$inc:{age:5}})
2.$set
用法:{$set:{field:value}}
作用:把文件中某個欄位field的值設為value
示例:db.students.update({name:"student"},{$set:{age:23}})
3.$unset
用法:{$unset:{field:1}}
作用:刪除某個欄位field
示例: db.students.update({name:"student"},{$unset:{age:1}})
4.$push
用法:{$push:{field:value}}
作用:把value追加到field裡。注:field只能是陣列型別,如果field不存在,會自動插入一個數組型別
示例:db.students.update({name:"student"},{$push:{"title":"major"}}
5.$rename
用法:{$rename:{old_field_name:new_field_name}}
作用:對欄位進行重新命名(不是值,是欄位)
示例:db.students.update({name:"student"},{$rename:{"name":"newname"}})
設定使用者許可權及訪問
1.給admin新增使用者
切換到admin庫:use admin
新增admin使用者:db.addUser(“root”,”admin”)
注意:必須先給admin庫新增使用者,否則就算給具體的庫添加了使用者,後續進入依然能操作具體庫.
因為預設admin庫使用者具有最高許可權,相當於具體庫需要認證時,進入的使用者持有的是admin的許可權,所以無需認證依然能進行操作.
2.給具體庫新增使用者
use openfire
db.addUser("openfire","password")
3.重啟mongo並在啟動時配置需要認證
方法一:退出重啟並加上auth引數
./bin/mongod -f conf/conf.properties –auth(注意是兩個-)
方法二:修改配置檔案,加上引數(推薦)
auth=true
3.測試許可權
>use openfire
>db.MySecondCollection.findOne();
Sat Mar 19 14:04:55.653 error: {
"$err" : "not authorized for query on openfire.MySecondCollection",
"code" : 16550
} at src/mongo/shell/query.js:128
4.認證並操作
//此處應該設定成更加恰當的使用者名稱及密碼
> db.auth("openfire","password")
1
> db.MySecondCollection.findOne()
{ "_id" : ObjectId("56ecde0662552d15c443dd4a"), "name" : "ming" }
>
5.另一種方法認證
在進入mongo時候加上資料庫及使用者名稱、密碼
./bin/mongo openfire -uopenfire -ppassword
root@test:/opt/mongotest/single/mongo# ./bin/mongo openfire -uopenfire -ppassword
MongoDB shell version: 2.4.6
connecting to: openfire
> db
openfire
> db.MySecondCollection.findOne()
{ "_id" : ObjectId("56ecde0662552d15c443dd4a"), "name" : "ming" }
>
mongdb進階
1.find()指定返回欄位
作用:減少流量
如果key:value,返回的value是個非常大的JSON,而我們不需要這麼多欄位,也許我們只需要其中的一個.
那麼使用projection來過濾:
db.collection.find(query, projection) 此處projection就是返回值的過濾條件
引數 | 型別 | 描述 |
---|---|---|
query | 文件 | 可選. 使用查詢操作符指定查詢條件 |
projection | 文件 | 可選.使用投影操作符指定返回的鍵。查詢時返回文件中所有鍵值, 只需省略該引數即可(預設省略). |
返回值: 匹配查詢條件的文件集合的遊標. 如果指定投影引數,查詢出的文件返回指定的鍵 ,”_id”鍵也可以從集合中移除掉。
_id不指定的話,總是會返回.
1或者true代表返回,0或者false代表不返回
示例:
db.MyFirstCollection.findOne({“title”:”new title”},{“description”:1,”_id”:0});
{ “description” : “this is test” }
也可以使用表示式:
db.MyFirstCollection.findOne({“title”:”new title”},{Items:{“$slice”:[3,1]}});