最近正在學習MongoDB,作為數據庫的學習當然是要從CRUD開始學起了。這篇文章默認讀者是知道如何安裝MongoDB、如何運行MongoDB實例以及了解了MongoDB中的collection、document等相關的概念。
網上對於MongoDB的增刪改查操作的文章不少。但是不少都是舊版本的操作操作說明。MongoDB在3.2版本之后,增刪改查的命令發生了一些變化。有寫變化網上可以找得到,這句話說完想必大家也都知道后面我想說什么了。是的,就是關於replaceOne()這個方法的。目前為止,我還沒有發現一篇比較滿意的中文教程。這里就記錄一下自己學習replaceOne()的一些心得。
以下的演示都是在ROBO 3T中操作完成的。
首先介紹一下replaceOne()這個函數,它主要是起到更新的作用,除此之外還有一些別的作用。我們來看例子。創建一個restaurant集合,包含了以下數據:
//restaurant集合包含以下數據
{ "_id" : 1, "name" : "Central Perk Cafe", "Borough" : "Manhattan" },
{ "_id" : 2, "name" : "Rock A Feller Bar and Grill", "Borough" : "Queens", "violations" : 2 },
{ "_id" : 3, "name" : "Empire State Pub", "Borough" : "Brooklyn", "violations" : 0 }
我們想嘗試replace一個文檔,文檔屬性name的值是"Central Perk Cafe",我們想把這個飯店的地點修改成“NewYork”
db.restaurant.replaceOne(
{name:"Central Perk Cafe"},
{name:"Central Perk Cafe", Borough:"NewYork"}
)
//匹配並修改成功
{ "acknowledged" : true, "matchedCount" : 1, "modifiedCount" : 1 }
//如果沒有匹配到這個文檔,例如我們傳入了錯誤的name值
{ "acknowledged" : true, "matchedCount" : 0, "modifiedCount" : 0 }
replaceOne()還可以傳入參數UpSert,來看下面這個例子:
db.restaurant.replaceOne(
{name:"Pizza Rat's Pizzaria"},
{"_id":4, name" : "Pizza Rat's Pizzaria", "Borough" : "Manhattan", "violations" : 8 },
{upsert:true}
)
//執行結果
{
"acknowledged" : true,
"matchedCount" : 0,
"modifiedCount" : 0,
"upsertedId" : 4
}
當沒有匹配到帶有這個name屬性文檔的時候,由於傳入了upser參數,Mongo就自動為我們創建了這個文檔。這里為了對應前面的_id格式,我們顯式的指定了這個文檔的id是4,當然也可以交由MongoDB自動為我們生成。
再來看replaceOne()的另外一個參數:Collation,我們首先添加一些測試數據
{ _id: 10, category: "café", status: "A" },
{ _id: 20, category: "cafe", status: "a" },
{ _id: 30, category: "cafE", status: "a" }
db.restaurant.replaceOne(
{ category: "cafe", status: "a" },
{ category: "cafÉ", status: "Replaced" },
{collation:{locale:"fr",strength:1}}
)
replaceOne()不僅替換了"cafÉ"的status,還進行了排序操作。
來源:https://www.2cto.com/database/201804/738609.html