1. 程式人生 > 實用技巧 >MongoDB教程11-MongoDB插入文件

MongoDB教程11-MongoDB插入文件

這裡將向大家介紹如何將資料插入到 MongoDB 的集合中。

文件的資料結構和 JSON 基本一樣。

所有儲存在集合中的資料都是 BSON 格式。

BSON 是一種類似 JSON 的二進位制形式的儲存格式,是 Binary JSON 的簡稱。

文件是MongoDB中儲存的基本單元,是一組有序的鍵值對集合。文件中儲存的文件鍵的格式必須是符合 UTF-8 標準的字串,同時要遵循以下注意事項:

  • 不能包含\0字元(空字元),因為這個字元表示鍵的結束;
  • 不能包含$.,因為.$是被保留的,只能在特定環境下使用;
  • 鍵名區分大小寫;
  • 鍵的值區分型別(如字串和整數等);
  • 鍵不能重複,在一條文件裡起唯一的作用。

注意,以上所有命名規範必須符合 UTF-8 標準的字串,文件的鍵值對是有順序的,相同的鍵值對如果有不同順序,也是不同的文件。

例1:以下兩組文件是不同的,因為值的型別不同。

{"recommend":"5"}
{"recommend":5}

例2:以下兩組文件也是不同的,因為鍵名是區分大小寫的。

{"Recommend":"5"}
{"recommend":"5"}

例3:以下兩組文件也是不同的,因為鍵值對有不同順序。

{"name":"tom", "age":10}
{"age":10, "name":"tom"}

MongoDB插入文件

要將資料插入MongoDB集合中,可以使用 MongoDB 的 insert() 方法,同時 MongoDB 針對插入一條還是多條資料,提供了更可靠的 insertOne() 和 insertMany() 方法。

MongoDB 向集合裡插入記錄時,無須事先對資料儲存結構進行定義。如果待插入的集合不存在,則插入操作會預設建立集合。

在 MongoDB 中,插入操作以單個集合為目標,MongoDB 中的所有寫入操作都是單個文件級別的原子操作。

向集合中插入資料的語法如下:

db.collection.insert(
<document or array of documents>,
{
    writeConcern: <document>,    //可選欄位
    ordered: <boolean>    //可選欄位
    }
)

collection 為集合名,insert() 為插入文件命令

引數說明:

  • <document or array of documents> 引數表示可設定插入一條或多條文件。
  • writeConcern:<document> 引數表示自定義寫出錯的級別,是一種出錯捕捉機制, 預設為 1,即要求確認寫操作,0 是不要求。
  • ordered:<boolean> 是可選的,預設為 true。
    • 如果為 true,在陣列中執行文件的有序插入,並且如果其中一個文件發生錯誤,MongoDB 將返回而不處理陣列中的其餘文件;
    • 如果為 false,則執行無序插入,若其中一個文件發生錯誤,則忽略錯誤,繼續處理陣列中的其餘文件。

插入不指定 _id 欄位的文件的程式碼如下:

> db.myColl3.insert({"title":"MongoDB教程",    // 命令沒結束, 回車可以換行
... "info":"MongoDB 是一個 Nosql 資料庫"
... })
WriteResult({ "nInserted" : 1 })

myColl3集合如果不存在,自動建立並插入文件...

在插入期間,mongod 將建立 _id 欄位併為其分配唯一的 Objectld 值,這裡的 mongod 是一個 MongoDB 伺服器的例項,也就是 MongoDB 服務駐紮在計算機上的程序。

檢視集合文件的程式碼如下:

> db.myColl3.find()
{ "_id" : ObjectId("5f4f4845e8b8099c8e7dbec9"), "title" : "MongoDB教程", "info" : "MongoDB 是一個 Nosql 資料庫" }

這些 Objectld 值與執行時操作時的機器和時間有關,因此,使用者執行這段命令後的返回值與示例中的值是不同的。

插入指定 _id 欄位的文件,值 _id 必須在集合中唯一,以避免重複鍵錯誤,程式碼如下:

> db.myColl3.insert({    // 命令沒結束, 回車換行
... "_id":1,
... "title":"insert指定_id",
... "info":"MongoDB插入資料"
... })
WriteResult({ "nInserted" : 1 })
> db.myColl3.find()
{ "_id" : ObjectId("5f4f4845e8b8099c8e7dbec9"), "title" : "MongoDB教程", "info" : "MongoDB 是一個 Nosql 資料庫" }
{ "_id" : 1, "title" : "insert指定_id", "info" : "MongoDB插入資料" }

可以看到新插入文件的 id 值為設定的 id 值1。如果插入指定_id重複, 如下:

> db.myColl3.insert({
... "_id":1
... })
WriteResult({
        "nInserted" : 0,
        "writeError" : {
                "code" : 11000,
                "errmsg" : "E11000 duplicate key error collection: myDB.myColl3 index: _id_ dup key: { _id: 1.0 }"
        }
})

插入的多個文件無須具有相同的欄位。例如,下面程式碼中的第一個文件包含一個 _id 欄位和一個 type 欄位,第二個和第三個文件不包含 _id 欄位。因此,在插入過程中,MongoDB 將會為第二個和第三個文件建立預設 _id 欄位,程式碼如下:

> db.myColl3.insert([  // 一次插入多個文件, 使用[{},{}...]的格式
... {"_id":2, "name":"張三", "age":18, "address":"中國"},
... {"name":"李四", "age":19},
... {"info":"Hello", "car":"buick"}
... ])
BulkWriteResult({
        "writeErrors" : [ ],
        "writeConcernErrors" : [ ],
        "nInserted" : 3,
        "nUpserted" : 0,
        "nMatched" : 0,
        "nModified" : 0,
        "nRemoved" : 0,
        "upserted" : [ ]
})

查詢驗證,可以看到在 _id 插入期間,系統自動為第二、第三個文件建立了欄位,程式碼如下:

> db.myColl3.find()
{ "_id" : ObjectId("5f4f4845e8b8099c8e7dbec9"), "title" : "MongoDB教程", "info" : "MongoDB 是一個 Nosql 資料庫" }
{ "_id" : 1, "title" : "insert指定_id", "info" : "MongoDB插入資料" }
{ "_id" : 2, "name" : "張三", "age" : 18, "address" : "中國" }
{ "_id" : ObjectId("5f4f4b95e8b8099c8e7dbeca"), "name" : "李四", "age" : 19 }
{ "_id" : ObjectId("5f4f4b95e8b8099c8e7dbecb"), "info" : "Hello", "car" : "buick" }

注意插入多條資料使用[{}, {}...]的格式

我們也可以將資料定義為一個變數,如下所示:

> document=({"name":"test", "age":66})
{ "name" : "test", "age" : 66 }
>
> db.myColl3.insert(document)
WriteResult({ "nInserted" : 1 })
>
> db.myColl3.find()
{ "_id" : ObjectId("5f4f4845e8b8099c8e7dbec9"), "title" : "MongoDB教程", "info" : "MongoDB 是一個 Nosql 資料庫" }
{ "_id" : 1, "title" : "insert指定_id", "info" : "MongoDB插入資料" }
{ "_id" : 2, "name" : "張三", "age" : 18, "address" : "中國" }
{ "_id" : ObjectId("5f4f4b95e8b8099c8e7dbeca"), "name" : "李四", "age" : 19 }
{ "_id" : ObjectId("5f4f4b95e8b8099c8e7dbecb"), "info" : "Hello", "car" : "buick" }
{ "_id" : ObjectId("5f4f510ae8b8099c8e7dbecc"), "name" : "test", "age" : 66 }  // document變數定義的資料

有序地插入多條文件的程式碼如下:

> db.myColl3.insert([
        {_id:10, item:"pen", price:"20" },
        {_id:12, item:"redpen", price: "30" },
        {_id:11, item:"bluepen", price: "40" }
    ],
    {ordered:true}
)

在設定 ordered:true 時,插入的資料是有序的,如果存在某條待插入文件和集合的某文件 _id 相同的情況,_id 相同的文件與後續文件都將不再插入。在設定 ordered:false 時,除了出錯記錄(包括 _id 重複)外其他的記錄繼續插入。

MongoDB 3.2 更新後新增以下兩種新的文件插入命令如下:

db.collection.insertone ()
db.collection.insertMany()

使用 insertOne() 插入一條文件的程式碼如下:

db.myColl.iusertone( { item: "card", qty: 15 } );

使用 insertMany() 插入多條文件的程式碼如下:

db.myColl.insertMany([
    { item: "card", qty: 15 },
    { item: "envelope", qty: 20 },
    { item: "stamps", qty:30 }
]);