[mongo] {第二部分}mongoDB CRUD v1
CRUD操作可create,?read,?update和delete??documents。
create
創建或插入操作會將新documents添加到collection中。如果該集合當前不存在,則插入操作將創建該集合。
MongoDB提供了以下將文檔插入集合的方法:
db.collection.insertOne()?3.2版中的新功能
db.collection.insertMany()?3.2版中的新功能
在MongoDB中,插入操作的目標是單個collection。MongoDB中的所有寫操作在單個文檔級別上都是原子性的?。
Insert
插入一個文檔
db.collection.insertOne()將單個?文檔插入集合中。
以下示例將一個新文檔插入到?inventory集合中。如果文檔未指定_id字段,則MongoDB將_id具有ObjectId值的字段添加到新文檔中。
db.inventory.insertOne( { item: "canvas", qty: 100, tags: ["cotton"], size: { h: 28, w: 35.5, uom: "cm" } } )
insertOne()返回包含新插入的文檔的_id字段值的文檔。
要檢索剛剛插入的文檔,請查詢集合:
db.inventory.find( { item: "canvas" } )
插入多個文檔
3.2版中的新功能。
db.collection.insertMany()可以將多個?文檔插入一個集合中。將文檔數組傳遞給該方法。
下面的示例將三個新文檔插入到?inventory集合中。如果文檔未指定?_id字段,則MongoDB將_id具有ObjectId值的字段添加到每個文檔。
db.inventory.insertMany([ { item: "journal", qty: 25, tags: ["blank", "red"], size: { h: 14, w: 21, uom: "cm" } }, { item: "mat", qty: 85, tags: ["gray"], size: { h: 27.9, w: 35.5, uom: "cm" } }, { item: "mousepad", qty: 25, tags: ["gel", "blue"], size: { h: 19, w: 22.85, uom: "cm" } } ])
Insert Behavior
如果該集合當前不存在,則插入操作將創建該集合。
在MongoDB中,存儲在集合中的每個文檔都需要一個唯一的?_id字段作為主鍵。如果插入的文檔省略了該_id字段,則MongoDB會自動為該字段生成一個ObjectId_id。
這也適用于通過upsert:true通過更新操作插入的文檔。
MongoDB中的所有寫操作都是單個文檔級別的原子操作。
對于寫問題,您可以指定MongoDB向寫操作請求的確認級別。
Insert Methods
MongoDB提供了以下將文檔插入到集合中的方法:
db.collection.insertOne()
插入單個文檔到集合中
db.collection.insertMany()
db.collection.insertMany()?插入多個文檔到集合中
db.collection.insert()
db.collection.insert()插入單個或多個文檔到集合中
以下方法還可以將新文檔添加到集合中:
db.collection.update()?when used with the?upsert:?true?option.
db.collection.updateOne()?when used with the?upsert:?true?option.
db.collection.updateMany()?when used with the?upsert:?true?option.
db.collection.findAndModify()?when used with the?upsert:?true?option.
db.collection.findOneAndUpdate()?when used with the?upsert:?true?option.
db.collection.findOneAndReplace()?when used with the?upsert:?true?option.
db.collection.save().
db.collection.bulkWrite().
See the individual reference pages for the meth
查詢
讀取操作從?集合中檢索文檔;?即查詢文檔集合。MongoDB提供了以下方法來從集合中讀取文檔:
db.collection.find()
您可以指定查詢或篩選條件以標識要返回的文檔。
列出集合中的所有文檔
要選擇集合中的所有文檔,請將空文檔作為查詢過濾器參數傳遞給find方法。查詢過濾器參數確定選擇條件:
db.inventory.find( {} )
此操作對應于以下SQL語句:
SELECT * FROM inventory
指定相等條件
要指定相等條件,請
{
以下示例從inventory集合中選擇status等于的所有文檔"D":
db.inventory.find( { status: "D" } )
此操作對應于以下SQL語句:
SELECT * FROM inventory WHERE status = "D"
指定條件下使用查詢運算符
文檔可以使用查詢運算符,以指定在以下形式的條件:
{
以下示例從inventory?集合中檢索status等于"A"或的所有文檔"D":
db.inventory.find( { status: { $in: [ "A", "D" ] } } )
注意
盡管可以使用$or運算符表示此查詢,但是在同一字段上執行相等性檢查時,請使用$in運算符而不是$or運算符。
該操作對應于以下SQL語句:
db.inventory.find( { status: { $in: [ "A", "D" ] } } )
AND條件
復合查詢可以為集合文檔中的多個字段指定條件。隱式地,邏輯AND連接將復合查詢的子句連接起來,以便查詢選擇集合中符合所有條件的文檔。
以下示例檢索inventory?集合中status等于"A"?和?qty小于($lt)的所有文檔30:
db.inventory.find( { status: "A", qty: { $lt: 30 } } )
該操作對應于以下SQL語句:
SELECT * FROM inventory WHERE status = "A" AND qty < 30
OR條件
使用$or運算符,您可以指定一個復合查詢,該查詢將每個子句與一個邏輯連接符連接在一起,OR以便該查詢選擇集合中至少匹配一個條件的文檔。
以下示例檢索status等于"A"?或?qty小于($lt)的集合中的所有文檔30:
db.inventory.find( { $or: [ { status: "A" }, { qty: { $lt: 30 } } ] } )
該操作對應于以下SQL語句:
SELECT * FROM inventory WHERE status = "A" OR qty < 30
注意
使用比較運算符的查詢?需進行Type Bracketing。
在下面的例子中,status等號"A"?和?任一?qty小于($lt)30?或?item開始字符為p:
{
該操作對應于以下SQL語句:
SELECT * FROM inventory WHERE status = "A" AND ( qty < 30 OR item LIKE "p%")
注意
MongoDB支持正則表達式$regex查詢以執行字符串模式匹配。
Update
Update操作修改在集合已存在的文檔。MongoDB提供了以下方法來更新集合的文檔:
db.collection.updateOne()?3.2版中的新功能
db.collection.updateMany()?3.2版中的新功能
db.collection.replaceOne()?3.2版中的新功能
在MongoDB中,更新操作針對單個集合。MongoDB中的所有寫操作都是單個文檔級別的原子操作。
您可以指定標識要更新的文檔的條件或過濾規則。這些過濾器使用與讀取操作相同的語法。
更新集合中的文檔
要更新文檔,MongoDB提供了?諸如的更新操作符$set來修改字段值。
要使用更新運算符,請將以下形式的更新文檔傳遞給更新方法:
{
$set如果該字段不存在,則某些更新運算符(例如)將創建該字段。
注意:
從MongoDB 4.2開始,MongoDB可以接受聚合管道來指定要進行的修改而不是更新文檔。有關詳細信息,請參見方法參考頁。
更新單個文檔
以下示例使用集合db.collection.updateOne()上的?方法?inventory更新等于的第一個文檔?:item 為 "paper"
db.inventory.updateOne( { item: "paper" }, { $set: { "size.uom": "cm", status: "P" }, $currentDate: { lastModified: true } } )
更新操作:
使用$set操作員更新的值?size.uom字段"cm"和值status?字段"P",
使用$currentDate運算符將lastModified字段的值更新為當前日期。如果?lastModified字段不存在,?$currentDate將創建該字段。
更新多個文檔
3.2版中的新功能。
以下示例使用集合db.collection.updateMany()?上的方法inventory更新qty小于的所有文檔?50:
db.inventory.updateMany( { "qty": { $lt: 50 } }, { $set: { "size.uom": "in", status: "P" }, $currentDate: { lastModified: true } } )
更新操作:
使用$set操作員更新的值?size.uom字段"in"和值status?字段"P",
使用$currentDate運算符將lastModified字段的值更新為當前日期。如果?lastModified字段不存在,?$currentDate將創建該字段。
替換一個文檔
要替換除_id?字段以外的文檔的所有內容,請將一個全新的文檔作為第二個參數傳遞給?db.collection.replaceOne()。
替換文檔時,替換文檔必須僅由字段/值對組成;即不包括更新運算符表達式。
替換文檔可以具有與原始文檔不同的字段。在替換文檔中,_id由于該_id字段是不可變的,因此可以省略該字段;但是,如果確實包含該_id字段,則該?字段必須與當前值具有相同的值。
下面的示例替換集合中的第一個文檔,?inventory其中:item:?"paper"
db.inventory.replaceOne( { item: "paper" }, { item: "paper", instock: [ { warehouse: "A", qty: 60 }, { warehouse: "B", qty: 40 } ] } )
Delete
刪除操作從集合中刪除文檔。MongoDB提供了以下刪除集合文檔的方法:
db.collection.deleteOne()?3.2版中的新功能
db.collection.deleteMany()?3.2版中的新功能
在MongoDB中,刪除操作的目標是單個collection。。
您可以指定條件或過濾器,以標識要刪除的文檔。這些過濾器使用與讀取操作相同的語法。
刪除所有文檔
要刪除集合中的所有文檔,請將空的篩選器文檔傳遞?{}給?db.collection.deleteMany()方法。
下面的示例從?集合中刪除所有文檔inventory:
db.inventory.deleteMany({})
該方法返回具有操作狀態的文檔
刪除所有符合條件的文檔
您可以指定標準或過濾器,以標識要刪除的文檔。該過濾器使用相同的語法,讀操作。
要指定相等條件,請
db.inventory.deleteMany({})
查詢過濾器文檔可以使用查詢運算符,以指定在以下形式的條件:
復制
復制的
{ < field1 >: { <運算符1 >: < value1 > }, ... }
要刪除所有符合刪除條件的文檔,請將過濾器參數傳遞?給該?deleteMany()方法。
以下示例從inventory?該status字段等于的集合中刪除所有文檔"A":
db.inventory.deleteMany({ status : "A" })
該方法返回具有操作狀態的文檔。
僅刪除一個符合條件的文檔
要最多刪除一個與指定過濾器匹配的文檔(即使多個文檔可能與指定過濾器匹配),請使用db.collection.deleteOne()方法。
下面的示例刪除第一文件,其中status是?"D":
db.inventory.deleteOne( { status: "D" } )
索引
即使從集合中刪除所有文檔,刪除操作也不會刪除索引。
Delete Methods
MongoDB提供了以下刪除集合文檔的方法:
db.collection.deleteOne()
即使多個文檔可能與指定過濾器匹配,也最多刪除一個與指定過濾器匹配的文檔。3.2版中的新功能。
db.collection.deleteMany()
刪除所有與指定過濾器匹配的文檔。3.2版中的新功能。
db.collection.remove()
刪除單個文檔或與指定過濾器匹配的所有文檔。
以下方法也可以從集合中刪除文檔:
collection.findOneAndDelete()。
findOneAndDelete()?提供了一個排序選項。該選項允許刪除按指定順序排序的第一個文檔。
collection.findAndModify()。
db.collection.findAndModify()提供排序選項。該選項允許刪除按指定順序排序的第一個文檔。
collection.bulkWrite()。
批量寫(Bulk Write)
概述
MongoDB使客戶端能夠批量執行寫操作。批量寫入操作會影響單個集合。MongoDB允許應用程序確定批量寫入操作所需的可接受級別。
3.2版中的新功能。
db.collection.bulkWrite()方法提供了執行批量插入,更新和刪除操作的能力。MongoDB還支持通過批量插入db.collection.insertMany()。
有序與無序操作
批量寫操作可以有序或無序。
通過有序操作,MongoDB串行執行操作。如果在寫操作之一的處理過程中發生錯誤,MongoDB將返回而不處理列表中任何剩余的寫操作。
使用不排序的操作,MongoDB可以并行執行操作,但是不能保證此行為。如果在寫操作之一的處理過程中發生錯誤,MongoDB將繼續處理列表中剩余的寫操作。
在分片集合上執行操作的有序列表通常比執行無序列表要慢,因為對于有序列表,每個操作必須等待上一個操作完成。
默認情況下,bulkWrite()執行ordered?操作。要指定unordered寫操作,請在選項文檔中進行設置?,ordered?:?false。
bulkWrite()方法
bulkWrite()?支持以下寫操作:
insertOne
updateOne
updateMany
replaceOne
deleteOne
deleteMany
每個寫操作都bulkWrite()作為文檔傳遞到數組中。
例如,以下執行多個寫操作:
try { db.characters.bulkWrite( [ { insertOne : { "document" : { "_id" : 4, "char" : "Dithras", "class" : "barbarian", "lvl" : 4 } } }, { insertOne : { "document" : { "_id" : 5, "char" : "Taeln", "class" : "fighter", "lvl" : 3 } } }, { updateOne : { "filter" : { "char" : "Eldon" }, "update" : { $set : { "status" : "Critical Injury" } } } }, { deleteOne : { "filter" : { "char" : "Brisbane" } } }, { replaceOne : { "filter" : { "char" : "Meldane" }, "replacement" : { "char" : "Tanys", "class" : "oracle", "lvl" : 4 } } } ] ); } catch (e) { print(e); }
批量插入分片集合的策略
大量的大容量插入操作(包括初始數據插入或常規數據導入)可能會影響分片群集的性能。對于批量插入,請考慮以下策略:
如果分片集合為空,則該集合只有一個初始塊,該塊位于單個分片上。然后,MongoDB必須花一些時間來接收數據,創建拆分并將拆分的塊分發到可用的分片。為了避免這種性能成本,您可以按照拆分碎片中的拆分塊中的說明預先拆分集合?。
要提高對分片群集的寫入性能,請使用?bulkWrite()可選參數ordered?設置為false。mongos可以嘗試同時將寫入發送到多個分片。對于空集合,首先按照分片群集中的分割塊中的說明預分割集合?。
如果您的分片鍵在插入過程中單調增加,則所有插入的數據都將到達集合中的最后一塊,該塊將始終以單個分片結尾。因此,群集的插入容量將永遠不會超過該單個分片的插入容量。
如果您的插入量大于單個分片可以處理的插入量,并且如果您無法避免單調增加的分片鍵,那么請考慮對應用程序進行以下修改:
反轉分片鍵的二進制位。這樣可以保留信息,并避免將插入順序與值序列的增加關聯起來。
交換第一個和最后一個16位字以“隨機”插入。
MongoDB 云數據庫 GaussDB(for Mongo) 數據庫
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。