您可以通過匹配完整文檔屬性(除要更新的屬性除外)來獲得所需的功能。下面的例子:
插入集合中的唯一文件:
db.collection.insert({ name: "John", surname: "Connor", age: 32, role: "commander", character: "cautious", hobby: "kill terminators" })
現在
db.collection.find({"name" : "John", "surname" : "Connor", "role" : "commander", "character" : "cautious", "hobby" : "kill terminators" })
回報:
{ "_id" : ObjectId("52fc9a02d342217e6262aa28"), "name" : "John", "surname" : "Connor", "age" : 32, "role" : "commander", "character" : "cautious", "hobby" : "kill terminators" }
update語句
db.collection.update({"name" : "John", "surname" : "Connor", "role" : "commander", "character" : "cautious", "hobby" : "kill terminators" },{$set:{age:33}}, { upsert: true })
次
更新現有文檔的屬性「年齡」:
{ "_id" : ObjectId("52fc9a02d342217e6262aa28"), "name" : "John", "surname" : "Connor", "age" : 33, "role" : "commander", "character" : "cautious", "hobby" : "kill terminators" }
如果運行完全相同的更新語句更改名稱(因此,查找查詢不會找到一個現有的文件):
db.collection.update({"name" : "Robot", "surname" : "Connor", "role" : "commander", "character" : "cautious", "hobby" : "kill terminators" },{$set:{age:33}}, { upsert: true })
「機器人康納」的文件將被創建,33歲,和你結束了自己收藏的兩份文件:
db.collection.find()
{ "_id" : ObjectId("52fc9a02d342217e6262aa28"), "name" : "John", "surname" : "Connor", "age" : 33, "role" : "commander", "character" : "cautious", "hobby" : "kill terminators" }
{ "_id" : ObjectId("52fc9a5f56641f5e1b883677"), "age" : 33, "character" : "cautious", "hobby" : "kill terminators", "name" : "Robot", "role" : "commander", "surname" : "Connor" }
注:我不相信更新的查詢參數上的額外屬性會對性能產生影響。
我做我的項目和我一樣第一次使用它的方式檢查,如果沒有記錄,然後插入,如果有則更新它,所以這兩個查詢,但只有一個經過我的檢查 –
後會跑我認爲DB不應該實現這個邏輯。這只是你程序的邏輯,爲什麼它應該在數據庫中?你應該檢查find查詢是否返回任何東西(這裏你可以使用limit 1來只檢查是否存在),並執行一個或另一個更新查詢。這不是DB的邏輯...... –
問題是,當你有1000名想要插入的工作人員時,使用upsert可以讓你說,線程安全。使用兩個步驟(查找和更新/插入),可能會導致有一個以上的JC,除非你設置姓名爲唯一索引(但我不如何設置他們是唯一隻爲一對名字,姓氏,除非使一個連接它們,使其獨特的額外字段) – kaytrance