1. 程式人生 > >linux部署mongodb及基本操作

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:查詢條件
objNewupdate物件和一些更新操作符
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]}});