Mongdb
mongdb入門
mongdb安裝
linux下安裝mangdb
wget https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-rhel62-3.2.10.tgz
- 下載下傳完成後解壓
tar zxvf mongodb-linux-x86_64-rhel62-3.2.10.tgz
- 安裝成功 安裝成功後的檔案結構目錄如下:
bin
mongo.exe
mongo.pdb
mongod.exe
mongod.pdb
mongodump.exe
mongoexport.exe
mongofiles.exe
mongoimport.exe
mongooplog.exe
mongoperf.exe
mongoperf.pdb
mongorestore.exe
mongos.exe
mongos.pdb
mongostat.exe
mongotop.exe
GNU-AGPL-3.0
README
THIRD-PARTY-NOTICES
bin
檔案夾下是mongodb的各種工具元件,具體功能請檢視mongodb手冊
- 進入
預設端口為27017/usr/local/mongod
./mongod --path=/data/db
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsIyZuBnLsdke4V2cwFHN3kDRulWbvw1My8CX0AzLcFjMwIzLcRXZu5Sas9Gbuk2Lc9CX6MHc0RHaiojIsJye.png)
- 浏覽器通路
mongodb常用啟動參數
mongod.exe
常用參數如下
參數 | 描述 |
---|---|
--bind_ip | 綁定服務IP,若綁定127.0.0.1,則隻能本機通路,不指定預設本地所有IP |
--logpath | 定MongoDB日志檔案,注意是指定檔案不是目錄 |
--logappend | 使用追加的方式寫日志 |
--dbpath | 指定資料庫路徑 |
--port | 指定服務端口号,預設端口27017 |
--serviceName | 指定服務名稱 |
--serviceDisplayName | 指定服務名稱,有多個mongodb服務時執行。 |
--install | 指定作為一個Windows服務安裝。 |
mongod.exe
的啟動參數,在window環境下和linux環境下并不相同,詳見mongod - mongodb啟動服務工具。
mongodb背景啟動
- 配置環境變量
export PATH=$PATH:/usr/local/mongodb-3.2.10/bin
- 編寫mongodb配置檔案
#資料庫路徑
dbpath=/data/db/
#日志輸出檔案路徑
logpath=/data/log/mongod.log
#錯誤日志采用追加模式
logappend=true
#啟用日志檔案,預設啟用
journal=true
#這個選項可以過濾掉一些無用的日志資訊,若需要調試使用請設定為false
quiet=true
#端口号 預設為27017
port=27017
-
vim /etc/init.d/mongdb
#!/bin/sh
# chkconfig: 2345 10 90
# description: myservice ....
#
# ### BEGIN INIT INFO
# Short-Description: mongodb
# Description: mongo db server
### END INIT INFO
#注意這裡的路徑設定為你的mongod的位置
PROGRAM=/usr/local/mongodb-3.2.10/bin/mongod
MONGOPID=`ps -ef | grep 'mongod' | grep -v grep | awk '{print $2}'`
test -x $PROGRAM || exit 0
case "$1" in
start)
ulimit -n 3000
echo "Starting MongoDB server"
#注意這裡的路徑設定為你的mongodb的配置檔案的位置
$PROGRAM --fork --quiet -f /data/conf/mongod.conf
echo "Started MongoDB server"
;;
stop)
echo "Stopping MongoDB server"
if [ ! -z "$MONGOPID" ]; then
kill -15 $MONGOPID
fi
echo "Stopped MongoDB server"
;;
status)
;;
*)
echo "Usage: mongodb {start|stop|status}"
exit 1
esac
exit 0
- 儲存完畢後執行下面幾條指令
# chmod +x /etc/init.d/mongodb
# chkconfig --add mongodb
# chkconfig mongodb on
- 然後啟動mongdb
service mongodb start
啟動shell
- 使用mongodb自帶的shell
mongodb資料增删
在mongodb中是通過資料庫、集合、文檔的方式來管理資料,下邊是mongodb與關系資料庫的一些概念對比:
建立資料庫
use DATABASE_NAME
如果資料庫不存在,則建立資料庫,否則切換到指定資料庫。
- 檢視所有資料庫
show dbs
可以看到我們剛剛建立的資料庫并不在清單中 如果想要添加進去必須插入一些資料
db.mongodb_test.insert({'name':'zgrey'})
- 再次檢視
MongoDB 中預設的資料庫為 test,如果你沒有建立新的資料庫,集合将存放在 test 資料庫中。
删除資料庫
db.dropDatabase()
删除目前資料庫,預設為 test,你可以使用 db 指令檢視目前資料庫名。
- 首先檢視所有資料庫
- 進入資料庫
-
db.dropDatabase()
- 再次檢視資料庫
- 集合删除的格式是
db.collection.drop()
集合增删
- 建立集合
db.createCollection(name, options)
name: 新建立的集合名稱
options: 建立參數
- 删除集合
db.collection.drop()
例子:
db.student.drop() 删除student集合
Mongodb插入文檔
- 文檔的資料結構和JSON基本一樣。
- 所有存儲在集合中的資料都是BSON格式。
- BSON是一種類json的一種二進制形式的存儲格式,簡稱Binary JSON。
- MongoDB 使用 insert() 或 save() 方法向集合中插入文檔,文法如下:
db.COLLECTION_NAME.insert(document)
- 以下文檔可以存儲在 MongoDB 的 mongo 資料庫 的 col集合中:
db.col.insert({title:'Mongodb_test',description:'Mongodb是一個Nosql資料庫',by:'zgrey',url:'www.zgrey.com',tags:['mongodb','test','zgrey'],likes:100})
以上執行個體中 col 是我們的集合名,前一章節我們已經建立過了,如果該集合不在該資料庫中, MongoDB 會自動建立該集合并插入文檔。
- 檢視資料庫
db.col.find()
- 我們也可以将資料定義為一個變量,如下所示:
document=({title:'Mongodb_test',description:'Mongodb是一個Nosql資料庫',by:'zgrey',url:'www.zgrey.com',tags:['mongodb','test','zgrey'],likes:100})
- 插入資料庫
db.col.insert(document)
插入文檔你也可以使用
db.col.save(document)
指令。如果不指定 _id 字段 save() 方法類似于 insert() 方法。如果指定 _id 字段,則會更新該 _id 的資料。
Mongodb删除文檔
MongoDB remove()函數是用來移除集合中的資料。
MongoDB資料更新可以使用update()函數。在執行remove()函數前先執行find()指令來判斷執行的條件是否正确,這是一個比較好的習慣。
- 删除文檔的基本文法
db.collection.remove(
<query>,
<justOne>
)
如果你的 MongoDB 是 2.6 版本以後的,文法格式如下:
db.collection.remove(
<query>,
{
justOne: <boolean>,
writeConcern: <document>
}
)
參數說明:
- query :(可選)删除的文檔的條件。
- justOne : (可選)如果設為 true 或 1,則隻删除一個文檔。
- writeConcern :(可選)抛出異常的級别。
使用find()函數查詢資料
- 接下來我們移除 title 為 'Mongodb_test' 的文檔:
db.col.remove({'title':'Mongodb_test'})
移除兩條資料
- 再次檢視集合
如果你隻想删除第一條找到的記錄可以設定 justOne 為 1,如下所示:
- 再次插入兩條新的資料
- 測試上面的指令
db.col.remove({title:'Mongodb_test'},1)
- 如果你想删除所有資料,可以使用以下方式(類似正常 SQL 的 truncate 指令):
>db.col.remove({})
>db.col.find()
更新文檔
MongoDB 使用 update() 和 save() 方法來更新集合中的文檔。接下來讓我們詳細來看下兩個函數的應用及其差別。
- update() 方法用于更新已存在的文檔。文法格式如下:
db.collection.update(
<query>,
<update>,
{
upsert: <boolean>,
multi: <boolean>,
writeConcern: <document>
}
)
- query : update的查詢條件,類似sql update查詢内where後面的。
- update : update的對象和一些更新的操作符(如$,$inc...)等,也可以了解為sql update查詢内set後面的
- upsert : 可選,這個參數的意思是,如果不存在update的記錄,是否插入objNew,true為插入,預設是false,不插入。
- multi : 可選,mongodb 預設是false,隻更新找到的第一條記錄,如果這個參數為true,就把按條件查出來多條記錄全部更新。
- writeConcern :可選,抛出異常的級别。
我們在集合 col 中插入如下資料:
- 接着我們通過 update() 方法來更新标題(title):
db.col.update({'title':'Mongodb_test'},{$set:{'title':'Mongodb'}})
以上語句隻會修改第一條發現的文檔,如果你要修改多條相同的文檔,則需要設定 multi 參數為 true。
>db.col.update({'title':'MongoDB'},{$set:{'title':'MongoDB'}},{multi:true})
- save方法
save() 方法通過傳入的文檔來替換已有文檔。文法格式如下:
db.collection.save(
<document>,
{
writeConcern: <document>
}
)
- document : 文檔資料。
測試: 這裡我們替換id為
ObjectId("60822d2002162bf438740c6e")
的文檔
db.col.save({"_id" : ObjectId("60822d2002162bf438740c6e"),'title':'Mongodb','description':'Mongodb Nosql','by':'zgrey','url':'www.zgrey',"tags" : [ "mongodb", "test", "zgrey" ], "likes" :123})
- 更多執行個體
隻更新第一條記錄:
db.col.update( { "count" : { $gt : 1 } } , { $set : { "test2" : "OK"} } );
全部更新:
db.col.update( { "count" : { $gt : 3 } } , { $set : { "test2" : "OK"} },false,true );
隻添加第一條:
db.col.update( { "count" : { $gt : 4 } } , { $set : { "test5" : "OK"} },true,false );
全部添加加進去:
db.col.update( { "count" : { $gt : 5 } } , { $set : { "test5" : "OK"} },true,true );
db.col.update( { "count" : { $gt : 15 } } , { $inc : { "count" : 1} },false,true );
db.col.update( { "count" : { $gt : 10 } } , { $inc : { "count" : 1} },false,false );
使用者操作
建立使用者
建立一個資料庫新使用者用db.createUser()方法,如果使用者存在則傳回一個使用者重複錯誤。
db.createUser(user, writeConcern)
- user:這個文檔建立關于使用者的身份認證和通路資訊;
- writeConcern:這個文檔描述保證MongoDB提供寫操作的成功報告。
User文檔
user文檔,定義了使用者的以下形式:
{ user: "<name>",
pwd: "<cleartext password>",
customData: { <any information> },
roles: [
{ role: "<role>", db: "<database>" } | "<role>",
...
]
}
user文檔字段介紹:
- user字段,為新使用者的名字;
- pwd字段,使用者的密碼;
- cusomData字段,為任意内容,例如可以為使用者全名介紹;
- roles字段,指定使用者的角色,可以用一個空數組給新使用者設定空角色;
在roles字段,可以指定内置角色和使用者定義的角色。
MongoDB内置角色有如下:
- 資料庫使用者角色:read、readWrite;
- 資料庫管理角色:dbAdmin、dbOwner、userAdmin;
- 叢集管理角色:clusterAdmin、clusterManager、clusterMonitor、hostManager;
- 備份恢複角色:backup、restore;
- 所有資料庫角色:readAnyDatabase、readWriteAnyDatabase、userAdminAnyDatabase、dbAdminAnyDatabase
-
超級使用者角色:root
// 這裡還有幾個角色間接或直接提供了系統超級使用者的通路(dbOwner 、userAdmin、userAdminAnyDatabase)
- 内部角色:__system
你可以點選這裡檢視每個角色所擁有的操作權限。
writeConcern文檔
- w選項:允許的值分别是 1、0、大于1的值、"majority"、;
- j選項:確定mongod執行個體寫資料到磁盤上的journal(日志),這可以確定mongd以外關閉不會丢失資料。設定true啟用。
- wtimeout:指定一個時間限制,以毫秒為機關。wtimeout隻适用于w值大于1。
示例
例如:在products資料庫建立使用者accountAdmin01,并給該使用者admin資料庫上clusterAdmin和readAnyDatabase的角色,products資料庫上readWrite角色。
use products
db.createUser( { "user" : "zgrey",
"pwd": "123",
"customData" : { employeeId: 12345 },
"roles" : [ { role: "clusterAdmin", db: "admin" },
{ role: "readAnyDatabase", db: "admin" },
"readWrite"
] },
{ w: "majority" , wtimeout: 5000 } )
- 測試
mongo -u zgrey -p 123 --authenticationDatabase products
查詢使用者
show users
删除使用者
- 格式
db.dropUser("使用者名")
修改使用者
- 先建立一個使用者 在products資料庫下
use products
db.createUser( { "user" : "zgrey",
"pwd": "123",
"customData" : { employeeId: 12345 },
"roles" : [ { role: "clusterAdmin", db: "admin" },
{ role: "readAnyDatabase", db: "admin" },
"readWrite"
] },
{ w: "majority" , wtimeout: 5000 } )
- 修改使用者的角色
db.updateUser('zgrey',{'roles':[{'role':'clusterAdmin','db':'admin'}]})
修改密碼
- 修改zgrey使用者密碼為789
db.changeUserPassword('zgrey','789')
-
mongo -uzgrey -p789 --authenticationDatabase products
java代碼連接配接mongodb
<dependency>
<groupId>org.mongodb</groupId>
<artifactId>mongo-java-driver</artifactId>
<version>3.2.1</version>
</dependency>
- 編寫測試類
@Test
public void connect(){
MongoClient mongoClient = new MongoClient("192.168.207.139",27017);
//也可以使用字元串進行連接配接
// MongoClientURI clientURI = new MongoClientURI("mongodb://192.168.207.139:27017");
// MongoClient mongoClient = new MongoClient(clientURI);
MongoDatabase products = mongoClient.getDatabase("mongodb");
MongoCollection<Document> col = products.getCollection("col");
Document first = col.find().first();
String s = first.toJson();
System.out.println(s);
}