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 } ]);