MongoDB 連線
mongodb://[username:password@]host1[:port1][,host2[:port2],...[,hostN[:portN]]][/[database][?options]]
mongodb:\\
這是固定格式,必須要指定- username:password@ 可選 使用者名稱:密碼
- host1 必須指定至少一個host,連線複製集,請指定多個主機地址
- port 可選指定埠,如果不填,預設 27017
- /database 如果指定username:password@,連線並驗證登陸指定資料庫。若不指定,預設開啟 test 資料庫
- ?options是連線選項,如果不使用/database,則前面需要加上/。
MongoDB 連線命令格式
$ ./mongo
MongoDB shell version: 4.0.9
connecting to: test
使用使用者 admin 使用密碼 123456 連線到本地的 MongoDB 服務上。輸出結果如下所示:
> mongodb://admin:123456@localhost/
...
更多連線例項
連線本地資料庫伺服器,埠是預設的。
mongodb://localhost
使用使用者名稱fred,密碼foobar登入localhost的admin資料庫。
mongodb://fred:foobar@localhost
使用使用者名稱fred,密碼foobar登入localhost的baz資料庫。
mongodb://fred:foobar@localhost/baz
連線 replica pair, 伺服器1為example1.com伺服器2為example2。
mongodb://example1.com:27017,example2.com:27017
連線 replica set 三臺伺服器 (埠 27017, 27018, 和27019):
mongodb://localhost,localhost:27018,localhost:27019
連線 replica set 三臺伺服器, 寫入操作應用在主伺服器 並且分佈查詢到從伺服器。
mongodb://host1,host2,host3/?slaveOk=true
直接連線第一個伺服器,無論是replica set一部分或者主伺服器或者從伺服器。
mongodb://host1,host2,host3/?connect=direct;slaveOk=true
當你的連線伺服器有優先順序,還需要列出所有伺服器,你可以使用上述連線方式。
安全模式連線到localhost:
mongodb://localhost/?safe=true
以安全模式連線到replica set,並且等待至少兩個複製伺服器成功寫入,超時時間設定為2秒。
mongodb://host1,host2,host3/?safe=true;w=2;wtimeoutMS=2000
MongoDB 建立資料庫
建立資料庫
use DATABASE_NAME
如果資料庫不存在,則建立資料庫,否則切換到指定資料庫
檢視資料庫
db
檢視所有資料庫
show dbs
剛建立的資料庫並不在全部資料庫列表中,如果顯示,需要插入資料
MongoDB 刪除資料庫
刪除當前資料庫
db.dropDatabase()
刪除集合
db.collection.drop()
以下例項刪除了 runoob 資料庫中的集合 site:
> use runoob
switched to db runoob
> db.createCollection("runoob") # 先建立集合,類似資料庫中的表
> show tables
runoob
> db.runoob.drop()
true
> show tables
>
MongoDB 建立集合
db.createCollection(name,options)
- name:要建立的集合名稱
- options:要選引數,指定有關記憶體大小及索引的選項
options 可以是如下引數 | 欄位 | 型別 | 描述 |
---|---|---|---|
capped | 布林 | (可選)如果為 true,則建立固定集合。固定集合是指有著固定大小的集合,當達到最大值時,它會自動覆蓋最早的文件。當該值為 true 時,必須指定 size 引數。 | |
autoIndexId | 布林 | (可選)如為 true,自動在 _id 欄位建立索引。預設為 false。 | |
size | 數值 | (可選)為固定集合指定一個最大值(以位元組計)。如果 capped 為 true,也需要指定該欄位。 | |
max | 數值 | (可選)指定固定集合中包含文件的最大數量。 |
在插入文件時,MongoDB 首先檢查固定集合的 size 欄位,然後檢查 max 欄位。
建立固定集合 mycol,整個集合空間大小 6142800 KB, 文件最大個數為 10000 個。
> db.createCollection("mycol", { capped : true, autoIndexId : true, size :
6142800, max : 10000 } )
{ "ok" : 1 }
>
MongoDB 刪除集合
db.collection.drop() # collection是集合名
MongoDB 插入文件
db.COLLECTION_NAME.inset(document)
以下文件可以儲存在 MongoDB 的 runoob 資料庫 的 col 集合中:
>db.col.insert({title: 'MongoDB 教程',
description: 'MongoDB 是一個 Nosql 資料庫',
by: '菜鳥教程',
url: 'http://www.runoob.com',
tags: ['mongodb', 'database', 'NoSQL'],
likes: 100
})
以上例項中 col 是我們的集合名,如果該集合不在該資料庫中, MongoDB 會自動建立該集合並插入文件。
檢視已插入文件:
以上例項中 col 是我們的集合名,如果該集合不在該資料庫中, MongoDB 會自動建立該集合並插入文件。
檢視已插入文件:
> db.col.find()
{ "_id" : ObjectId("56064886ade2f21f36b03134"), "title" : "MongoDB 教程", "description" : "MongoDB 是一個 Nosql 資料庫", "by" : "菜鳥教程", "url" : "http://www.runoob.com", "tags" : [ "mongodb", "database", "NoSQL" ], "likes" : 100 }
>
我們也可以將資料定義為一個變數,如下所示:
> document=({title: 'MongoDB 教程',
description: 'MongoDB 是一個 Nosql 資料庫',
by: '菜鳥教程',
url: 'http://www.runoob.com',
tags: ['mongodb', 'database', 'NoSQL'],
likes: 100
});
插入文件你也可以使用 db.col.save(document)
命令。如果不指定 _id 欄位 save() 方法類似於 insert() 方法。如果指定 _id 欄位,則會更新該 _id 的資料。
MongoDB 更新文件
update()方法
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 :可選,丟擲異常的級別。
save()方法
save()方法透過傳入的文件來代替已有的文件
db.collection.save(
<document>,
{
writeConcern: <document>
}
)
引數說明:
- document:文件資料
- writeConcern:可選,丟擲異常的級別
更多例項
只更新第一條記錄:
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 );
MongoDB 刪除文件
db.collection.remove(
<query>,
<justOne>
)
- query:可選,刪除文件的條件
- justOne:可選,如果設為 true 或 1,則只刪除一個文件,如果不設定該引數,或使用預設值 false,則刪除所有匹配條件的文件
MongoDB 查詢文件
db.collection.find(query, projection)
- query :可選,使用查詢運算子指定查詢條件
- projection :可選,使用投影運算子指定返回的鍵。查詢時返回文件中所有鍵值, 只需省略該引數即可(預設省略)。
若不指定 projection,則預設返回所有鍵,指定 projection 格式如下,有兩種模式
db.collection.find(query, {title: 1, by: 1}) // inclusion模式 指定返回的鍵,不返回其他鍵 db.collection.find(query, {title: 0, by: 0}) // exclusion模式 指定不返回的鍵,返回其他鍵
_id 鍵預設返回,需要主動指定 _id:0 才會隱藏
兩種模式不可混用(因為這樣的話無法推斷其他鍵是否應返回)
db.collection.find(query, {title: 1, by: 0}) // 錯誤
只能全1或全0,除了在inclusion模式時可以指定_id為0
db.collection.find(query, {_id:0, title: 1, by: 1}) // 正確
若不想指定查詢條件引數 query 可以 用 {} 代替,但是需要指定 projection 引數:
querydb.collection.find({}, {title: 1})
易讀的方式來讀取資料
>db.col.find().pretty()
pretty() 方法以格式化的方式來顯示所有文件 除了 find() 方法之外,還有一個 findOne() 方法,它只返回一個文件 |
操作 | 格式 | 範例 | RDBMS中的類似語句 |
---|---|---|---|---|
等於 | {:} | db.col.find({"by":"菜鳥教程"}).pretty() | where by = '菜鳥教程' | |
小於 | {:{$lt:}} | db.col.find({"likes":{$lt:50}}).pretty() | where likes < 50 | |
小於或等於 | {:{$lte:}} | db.col.find({"likes":{$lte:50}}).pretty() | where likes <= 50 | |
大於 | {:{$gt:}} | db.col.find({"likes":{$gt:50}}).pretty() | where likes > 50 | |
大於或等於 | {:{$gte:}} | db.col.find({"likes":{$gte:50}}).pretty() | where likes >= 50 | |
不等於 | {:{$ne:}} | db.col.find({"likes":{$ne:50}}).pretty() | where likes != 50 |
例項
如果是 qty 大於 50 小於 80 不能這樣寫:
db.posts.find( { qty: { $gt: 50 }, qty: { $lt: 80 } } )
應該這樣:
db.posts.find( { qty: { $gt: 50 ,$lt: 80}} )
MongoDB and條件
MongoDB的find()方法可以傳入多個鍵(key),每個鍵(key)以逗號隔開,即常規SQL的AND條件
>db.col.find({key1:value1, key2:value2}).pretty()
AND 和 OR 聯合使用
以下例項演示了 AND 和 OR 聯合使用,類似常規 SQL 語句為: 'where likes>50 AND (by = '菜鳥教程' OR title = 'MongoDB 教程')'
>db.col.find({"likes": {$gt:50}, $or: [{"by": "菜鳥教程"},{"title": "MongoDB 教程"}]}).pretty()
MongoDB 條件運算子
(>) 大於 - $gt greater than
(<) 小於 - $lt gt equal
(>=) 大於等於 - $gte less than
(<=) 小於等於 - $lte lt equal
(!=) 不等於 - $ne not equal
(=) 等於 - $eq equal
MongoDB (>) 大於運算子 - $gt
獲取 "col" 集合中 "likes" 大於 100 的資料
db.col.find({likes : {$gt : 100}})
類似SQL:select * from col where likes >100;
MongoDB(>=)大於等於運算子 - $gte
獲取"col"集合中 "likes" 大於等於 100 的資料
db.col.find({likes : {$gte : 100}})
類似SQL:select * from col where likes >=100;
MongoDB (<) 小於運算子 - $lt
獲取"col"集合中 "likes" 小於 150 的資料
db.col.find({likes : {$lt : 150}})
類似SQL:select * from col where likes < 150;
MongoDB (<=) 小於等於運算子 - $lte
獲取"col"集合中 "likes" 小於等於 150 的資料
db.col.find({likes : {$lte : 150}})
類似SQL:select * from col where likes <= 150;
MongoDB 使用 (<) 和 (>) 查詢 - $lt 和 $gt
獲取"col"集合中 "likes" 大於100,小於 200 的資料
db.col.find({likes : {$lt :200, $gt : 100}})
類似SQL:Select * from col where likes>100 AND likes<200;
模糊查詢
查詢 title 包含"教"字的文件:
db.col.find({title:/教/})
查詢 title 欄位以"教"字開頭的文件:
db.col.find({title:/^教/})
查詢 titl e欄位以"教"字結尾的文件:
db.col.find({title:/教$/})
本作品採用《CC 協議》,轉載必須註明作者和本文連結