MongoDB基本常用命令

橙香五花肉發表於2024-05-07

MongoDB基本常用命令

資料庫操作

選擇和建立資料庫

選擇和建立資料庫的語法格式:

use 資料庫名稱

如果資料庫不存在則自動建立,例如,以下語句建立 articledb 資料庫:

use articledb

檢視有許可權檢視的所有的資料庫命令

show dbs
或
show databases

注意: 在 MongoDB 中,集合只有在內容插入後才會建立! 就是說,建立集合(資料表)後要再插入一個文件(記錄),集合才會真正建立。

檢視當前正在使用的資料庫命令

db

MongoDB 中預設的資料庫為 test,如果你沒有選擇資料庫,集合將存放在 test 資料庫中。

資料庫名可以是滿足以下條件的任意UTF-8字串。

  • 不能是空字串("")。
  • 不得含有' '(空格)、.、$、/、\和\0 (空字元)。
  • 應全部小寫。
  • 最多64位元組。

有一些資料庫名是保留的,可以直接訪問這些有特殊作用的資料庫。

  • admin: 從許可權的角度來看,這是"root"資料庫。要是將一個使用者新增到這個資料庫,這個使用者自動繼承所有資料庫的許可權。一些特定的伺服器端命令也只能從這個資料庫執行,比如列出所有的資料庫或者關閉伺服器。
  • local: 這個資料永遠不會被複制,可以用來儲存限於本地單臺伺服器的任意集合
  • config: 當Mongo用於分片設定時,config資料庫在內部使用,用於儲存分片的相關資訊。

資料庫的刪除

MongoDB 刪除資料庫的語法格式如下:

db.dropDatabase()

提示:主要用來刪除已經持久化的資料庫

集合操作

集合,類似關係型資料庫中的表。可以顯示的建立,也可以隱式的建立。

集合的顯式建立(瞭解)

基本語法格式:

db.createCollection(name)
  • 引數說明:
    name: 要建立的集合名稱

例如:建立一個名為 mycollection 的普通集合。

db.createCollection("comment")

檢視當前庫中的表:show tables命令

show collections
或
show tables

集合的命名規範:

  • 集合名不能是空字串""。
  • 集合名不能含有\0字元(空字元),這個字元表示集合名的結尾。
  • 集合名不能以"system."開頭,這是為系統集合保留的字首。
  • 使用者建立的集合名字不能含有保留字元。有些驅動程式的確支援在集合名裡面包含,這是因為某些系統生成的集合中包含該字元。除非你要訪問這種系統建立的集合,否則千萬不要在名字裡出現$。

集合的隱式建立

當向一個集合中插入一個文件的時候,如果集合不存在,則會自動建立集合。詳見 文件的插入 章節。
提示:通常我們使用隱式建立文件即可。

集合的刪除

集合刪除語法格式如下:

db.collection.drop()
或
db.集合.drop()

返回值
如果成功刪除選定集合,則 drop() 方法返回 true,否則返回 false。

例如:要刪除comment集合

db.comment.drop()

文件基本CRUD

文件(document)的資料結構和 JSON 基本一樣。所有儲存在集合中的資料都是 BSON 格式。

文件的插入

(1)單個文件插入

  • 使用 insert()save() 方法向集合中插入文件,語法如下:

    db.collection.insert(
      <document or array of documents>,
      {
        writeConcern: <document>,
        ordered: <boolean>
      }
    )
    
  • 引數:

    Parameter Type Description
    document document or array 要插入到集合中的文件或文件陣列。((json格式)
    writeConcern document Optional. A document expressing the write concern. Omit to use the default write concern.See Write Concern.Do not explicitly set the write concern for the operation if run in atransaction. To use write concern with transactions, see Transactions and Write Concern.
    ordered boolean 可選。如果為真,則按順序插入陣列中的文件,如果其中一個文件出現錯誤,MongoDB將返回而不處理陣列中的其餘文件。如果為假,則執行無序插入,如果其中一個文件出現錯誤,則繼續處理陣列中的主文件。在版本2.6+中預設為true
  • 【示例】

    • 要向comment的集合(表)中插入一條測試資料:
    db.comment.insert({"name":"張三","age":18,"createDate":new Date()})
    
  • 提示:
    (1)comment集合如果不存在,則會隱式建立
    (2)mongo中的數字,預設情況下是double型別,如果要存整型,必須使用函式NumberInt(整型數字),否則取出來就有問題了。
    (3)插入當前日期使用 new Date()
    (4)插入的資料沒有指定 _id ,會自動生成主鍵值
    (5)如果某欄位沒值,可以賦值為null,或不寫該欄位

    執行後,如下,說明插入一個資料成功了。

    WriteResult({ "nInserted" : 1 })
    

    注意:

    1. 文件中的鍵/值對是有序的。
    2. 文件中的值不僅可以是在雙引號裡面的字串,還可以是其他幾種資料型別(甚至可以是整個嵌入的文件)。
    3. MongoDB區分型別和大小寫。
    4. MongoDB的文件不能有重複的鍵。
    5. 文件的鍵是字串。除了少數例外情況,鍵可以使用任意UTF-8字元。

    文件鍵命名規範:

    • 鍵不能含有\0 (空字元)。這個字元用來表示鍵的結尾。
    • .和$有特別的意義,只有在特定環境下才能使用。
    • 以下劃線"_"開頭的鍵是保留的(不是嚴格要求的)。

(2)批次插入

  • 語法:

    db.collection.insertMany(
      [ <document 1> , <document 2>, ... ],
      {
        writeConcern: <document>,
        ordered: <boolean>
      }
    )
    
  • 引數:

    Parameter Type Description
    document document or array 要插入到集合中的文件或文件陣列。((json格式)
    writeConcern document Optional. A document expressing the write concern. Omit to use the default writeconcern.Do not explicitly set the write concern for the operation if run in a transaction. Touse write concern with transactions, see Transactions and Write Concern.
    ordered boolean 可選。一個布林值,指定Mongod例項應執行有序插入還是無序插入。預設為true。
  • 【示例】

    db.comment.insertMany([
      {"name":"張三","age":18,"createDate":new Date()},
      {"name":"李四","age":19,"createDate":new Date()},
      {"name":"王五","age":20, "createDate":new Date()},
      {"name":"麻子","age":20, "createDate":new Date()}
    ])
    
  • 提示:
    (1)插入時指定了 _id ,則主鍵就是該值。
    (2)如果某條資料插入失敗,將會終止插入,但已經插入成功的資料不會回滾掉。
    (3)因為批次插入由於資料較多容易出現失敗,因此,可以使用try catch進行異常捕捉處理,測試的時候可以不處理。如(瞭解):

    try {
      db.comment.insertMany([
        {"name":"張三","age":18,"createDate":new Date()},
        {"name":"李四","age":19,"createDate":new Date()},
        {"name":"王五","age":20, "createDate":new Date()},
        {"name":"麻子","age":20, "createDate":new Date()}
      ]);
    } catch(e) {
      print(e);
    }
    

文件的基本查詢

查詢資料的語法格式如下:

db.collection.find(<query>, [projection])

引數:

Parameter Type Description
query document 可選。使用查詢運算子指定選擇篩選器。若要返回集合中的所有文件,請省略此引數或傳遞空文件( {} )。
projection document 可選。指定要在與查詢篩選器匹配的文件中返回的欄位(投影)。若要返回匹配文件中的所有欄位,請省略此引數。

【示例】

  • (1)查詢所有
    如果我們要查詢comment集合的所有文件,我們輸入以下命令

    db.comment.find()
    或
    db.comment.find({})
    

    這裡你會發現每條文件會有一個叫_id的欄位,這個相當於我們原來關聯式資料庫中表的主鍵,當你在插入文件記錄時沒有指定該欄位,MongoDB會自動建立,其型別是ObjectID型別。如果我們在插入文件記錄時指定該欄位也可以,其型別可以是ObjectID型別,也可以是MongoDB支援的任意型別。

    查詢 age為20的使用者,在find中新增引數

    db.comment.find({age:20})
    

    查詢 age為20的使用者,如果你只需要返回符合條件的第一條資料,我們可以使用findOne命令來實現,語法和find一樣

    db.comment.findOne({age:20})
    
  • (2)投影查詢(Projection Query)
    如果要查詢結果返回部分欄位,則需要使用投影查詢(不顯示所有欄位,只顯示指定的欄位)。如:查詢結果只顯示 _id、name、age:

    db.comment.find({age:20}, {name:1,age:1})
    

    預設 _id 會顯示。

    如:查詢結果只顯示 name、age,不顯示 _id :

    db.comment.find({age:20}, {name:1,age:1,_id:0})
    
    # 0不顯示
    # 1顯示
    

    再例如:查詢所有資料,但只顯示 _id、name、age:

    db.comment.find({}, {name:1,age:1})
    

文件的更新

更新文件的語法:

db.collection.update(query, update, options)
//或
db.collection.update(
  <query>,
  <update>,
  {
    upsert: <boolean>,
    multi: <boolean>,
    writeConcern: <document>,
    collation: <document>,
    arrayFilters: [ <filterdocument1>, ... ],
    hint: <document|string> // Available starting in MongoDB 4.2
  }
)

引數:

Parameter Type Description
query document 更新的選擇條件。可以使用與find()方法中相同的查詢選擇器,類似sql update查詢內where後面的。。在3.0版中進行了更改:當使用upsert:true執行update()時,如果查詢使用點表示法在_id欄位上指定條件,則MongoDB將拒絕插入新文件。
update document or pipeline 要應用的修改。該值可以是:包含更新運算子表示式的文件,或僅包含:對的替換文件,或在MongoDB 4.2中啟動聚合管道。管道可以由以下階段組成: 癲 其 別 名 set 癲 其 別 名unset 癲 其 別 名 replaceWith。換句話說:它是update的物件和一些更新的運算子(如 inc...)等,也可以理解為
upsert boolean 可選。如果設定為true,則在沒有與查詢條件匹配的文件時建立新文件。預設值為false,如果找不到匹配項,則不會插入新文件。
multi boolean 可選。如果設定為true,則更新符合查詢條件的多個文件。如果設定為false,則更新一個文件。預設值為false。
writeConcern document 可選。表示寫問題的文件。丟擲異常的級別。
collation document 可選。指定要用於操作的校對規則。校對規則允許使用者為字串比較指定特定於語言的規則,例如字母大小寫和重音標記的規則。校對規則選項具有以下語法:校對規則:{區域設定:,caseLevel:,caseFirst:,強度:,numericordering:,替代:,最大變數:,向後:}指定校對規則時,區域設定欄位是必需的;所有其他校對規則欄位都是可選的。有關欄位的說明,請參閱校對規則文件。如果未指定校對規則,但集合具有預設校對規則(請參見db.createCollection()),則該操作將使用為集合指定的校對規則。如果沒有為集合或操作指定校對規則,MongoDB將使用以前版本中使用的簡單二進位制比較進行字串比較。不能為一個操作指定多個校對規則。如,不能為每個欄位指定不同的校對規則,或者如果使用排序執行查詢,則不能將一個校對規則用於查詢,另一個校對規則用於排序。3.4版新增。
arrayFilters array 可選。一個篩選文件陣列,用於確定要為陣列欄位上的更新操作修改哪些陣列元素。
hint document or string 可選。指定用於支援查詢謂詞的索引的文件或字串。該選項可以採用索引規範文件或索引名稱字串。如果指定的索引不存在則說明操作錯誤。例如,請參閱版本4中的“為更新操作指定提示。

提示:主要關注前四個引數即可。

【示例】

  • (1)覆蓋的修改
    如果我們想修改name為張三的記錄,年齡更改為30,輸入以下語句

    db.comment.update({name:"張三"}, {age:30})
    

    執行後,我們會發現,這條文件除了age欄位其它欄位都不見了,如果只需改某個欄位就需要使用下方區域性修改

  • (2)區域性修改
    為了解決這個問題,我們需要使用修改器$set來實現,命令如下:我們想修改name為李四的記錄,年齡更改為30,輸入以下語句:

    db.comment.update({name:"李四"}, {$set:{age:30}})
    
  • (3)批次的修改
    更新所有年齡為20的使用者名稱稱為測試

    # 預設只修改第一條資料
    db.comment.update({age:20}, {$set:{name:"測試"}})
    # 修改所有符合條件的資料
    db.comment.update({age:20}, {$set:{name:"測試"}}, {multi:true})
    

    提示:如果不加後面的引數,則只更新符合條件的第一條記錄

  • (4)列值增長的修改
    如果我們想實現對某列值在原有值的基礎上進行增加或減少,可以使用 $inc 運算子來實現。需求:對名稱為張三使用者的年齡數,每次遞增1

    db.comment.find({name:"張三"}, {$inc:{age:1}})
    

刪除文件

刪除文件的語法結構:

db.集合名稱.remove(條件)

以下語句可以將資料全部刪除,請慎用

db.comment.remove({})

如果刪除age=18的記錄,輸入以下語句

db.comment.remove({age:19})

文件的分頁查詢

統計查詢

統計查詢使用count()方法,語法如下:

db.collection.count(query, options)

引數:

Parameter Type Description
query document 查詢選擇條件。
options document 可選。用於修改計數的額外選項。

提示:可選項暫時不使用。

【示例】

  • (1)統計所有記錄數:
    統計comment集合的所有的記錄數:

    db.comment.count()
    
  • (2)按條件統計記錄數:
    例如:統計age為20的記錄條數

    db.comment.count({age:20})
    

提示:預設情況下 count() 方法返回符合條件的全部記錄條數。

分頁列表查詢

可以使用limit()方法來讀取指定數量的資料,使用skip()方法來跳過指定數量的資料。基本語法如下所示:

db.COLLECTION_NAME.find().limit(NUMBER).skip(NUMBER)

如果你想返回指定條數的記錄,可以在find方法後呼叫limit來返回結果(TopN),預設值20,例如:

db.comment.find().limit(3)

skip方法同樣接受一個數字引數作為跳過的記錄條數。(前N個不要),預設值是0

db.comment.find().skip(3)

分頁查詢:需求:每頁2個,第二頁開始:跳過前兩條資料,接著值顯示3和4條資料

//第一頁
db.comment.find().skip(0).limit(2)
//第二頁
db.comment.find().skip(2).limit(2)
//第三頁
db.comment.find().skip(4).limit(2)

排序查詢

sort() 方法對資料進行排序,sort() 方法可以透過引數指定排序的欄位,並使用 1 和 -1 來指定排序的方式,其中 1 為升序排列,而 -1 是用於降序排列。語法如下所示:

db.COLLECTION_NAME.find().sort({KEY:1})
或
db.集合名稱.find().sort(排序方式)

例如:對age降序排列

db.comment.find().sort({age:-1})

提示:skip(), limilt(), sort()三個放在一起執行的時候,執行的順序是先 sort(), 然後是 skip(),最後是顯示的 limit(),和命令編寫順序無關。

文件的更多查詢

正則的複雜條件查詢

MongoDB的模糊查詢是透過正規表示式的方式實現的。格式為:

db.collection.find({field:/正規表示式/})
或
db.集合.find({欄位:/正規表示式/})

提示:正規表示式是js的語法,直接量的寫法。

例如,我要查詢姓名包含“張”的所有文件,程式碼如下:

db.comment.find({name:/張/})

如果要查詢姓名以“張”開頭的,程式碼如下:

db.comment.find({content:/^張/})

比較查詢

<, <=, >, >= 這個運算子也是很常用的,格式如下:

db.集合名稱.find({ "field" : { $gt: value }}) // 大於: field > value
db.集合名稱.find({ "field" : { $lt: value }}) // 小於: field < value
db.集合名稱.find({ "field" : { $gte: value }}) // 大於等於: field >= value
db.集合名稱.find({ "field" : { $lte: value }}) // 小於等於: field <= value
db.集合名稱.find({ "field" : { $ne: value }}) // 不等於: field != value
db.集合名稱.find({ "field" : { $eq: value }}) // 等於: field = value

示例:查詢年齡大於19的記錄

db.comment.find({age:{$gt:19}})

包含查詢

包含使用$in運算子。 示例:查詢年齡包含18和19的文件

db.comment.find({age:{$in:[18, 19]}})

不包含使用$nin運算子。 示例:查詢年齡不包含18和19的文件

db.comment.find({age:{$nin:[18, 19]}})

條件連線查詢

我們如果需要查詢同時滿足兩個以上條件,需要使用$and運算子將條件進行關聯。(相 當於SQL的and) 格式為:

$and:[ { },{ },{ } ]

示例:查詢集合中age大於等於19 並且小於20的文件:

db.comment.find({age:{$and:[{age:{$gte:19}}, {age:{$lt:20}}]}})

如果兩個以上條件之間是或者的關係,我們使用 運算子進行關聯,與前面 and的使用方式相同 格式為:

$or:[ { },{ },{ } ]

示例:查詢集合中age大於等於19 或者小於20的文件:

db.comment.find({age:{$or:[{age:{$gte:19}}, {age:{$lt:20}}]}})

常用命令小結

選擇切換資料庫:use articledb
插入資料:db.comment.insert({bson資料})
查詢所有資料:db.comment.find();
條件查詢資料:db.comment.find({條件})
查詢符合條件的第一條記錄:db.comment.findOne({條件})
查詢符合條件的前幾條記錄:db.comment.find({條件}).limit(條數)
查詢符合條件的跳過的記錄:db.comment.find({條件}).skip(條數)
修改資料:db.comment.update({條件},{修改後的資料}) 或db.comment.update({條件},{$set:{要修改部分的欄位:資料})
修改資料並自增某欄位值:db.comment.update({條件},{$inc:{自增的欄位:步進值}})
刪除資料:db.comment.remove({條件})
統計查詢:db.comment.count({條件})
模糊查詢:db.comment.find({欄位名:/正規表示式/})
條件比較運算:db.comment.find({欄位名:{$gt:值}})
包含查詢:db.comment.find({欄位名:{$in:[值1,值2]}})或db.comment.find({欄位名:{$nin:[值1,值2]}})
條件連線查詢:db.comment.find({$and:[{條件1},{條件2}]})或db.comment.find({$or:[{條件1},{條件2}]})

相關文章