MongoDB 學習

OnlyDawn發表於2019-07-25

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 協議》,轉載必須註明作者和本文連結

相關文章