2013-02-12 88 views
3

我想知道如何引用返回的文檔屬性從查找 和修改中使用它。 E.x. :MongoDB的findAndModify原子

var totalNoOfSubjects = 5; 
db.people.findAndModify({ 
    query: { name: "Tom", state: "active", rating: { $gt: 10 } }, 
    sort: { rating: 1 }, 
    update: { $set: { average: <reference score value returned by find>/totalNoOfSubjects} } 
    }); 

我的理解是,findAndModify鎖定的文件,所以我想在執行更新的修改使用在查找中發現的屬性。這將使原子操作 。

,如果這是由蒙戈支持我不知道。

回答

1

不,你不能在findAndModify的更新部分中參考值,發現文件內。在這方面與update相同。

因此,你不能因爲你需要先提取文檔,然後工藝的updatefindAndMondify包含從您的文檔獲取計算的值做到這一點原子。

https://jira.mongodb.org/browse/SERVER-458這可能在未來加以解決的一種方式。

+0

讚賞回覆...我希望Mongo支持這個功能,儘管我想不出支持它的原因。如果$公司可以修改原子使用查找部分返回的文檔雖然蒙戈內部完成...再次進行類似爲什麼不讓用戶還指定要在更新部分從發現返回的值引用...謝謝 – 2013-02-12 09:37:12

-1

原子性正是爲findAndModify的原因。

作爲stated in the docs,蒙戈會發現一個或多個文檔(匹配指定query)修改一個文件(使用update指定)。整個過程是原子的。默認的實現是Mongo返回找到的文檔(處於未更改的狀態)。這可以使用new選項進行修改。

+0

相反,「查找」和「更新」命令的部分是不是原子。其他操作可以在查找和更新之間執行。這就是爲什麼它不能用於在字段上強制執行唯一性,並且您需要唯一的約束。參考:https://docs.mongodb.com/manual/reference/method/db.collection.findAndModify/#upsert-and-unique-index – Iravanchi 2017-07-16 13:31:54

+0

@Iravanchi:根據您引用的鏈接「修改_single文檔_時,都'''findAndModify()'''和update()''''方法_atomically_更​​新文檔。「 – 2017-07-17 14:53:41