![](/img/trans.png)
[英]MongoDB how to update a count field with the number of elements that are in an array on the document
[英]MongoDB: incorrect update count
在我的數據庫中,我有一個名為“水果”的字段,它是一個簡單的數組。 在此數組中插入元素時,我使用$addToSet
僅插入此數組中尚不存在的元素。
我想知道我插入的元素是否真的修改了該字段。 但是, 即使我嘗試添加已經存在的元素,回調中的docModified
參數也始終返回1 。
model.update (
{ username: username }, // find the document
{ $addToSet : { fruits: "apple" } }, // add "apple" to fruits field
function (err, docModified) {
console.log(docModified);
// !PROBLEM: this will print "1" no matter what
}
);
有人知道為什么嗎? 非常感謝! (順便說一句,我正在使用貓鼬)
貓鼬中的當前方法實現使用舊版寫關注API來確定已修改文檔的數量。 如您所述,即使沒有對內容進行實際更改(例如,未將新成員添加到集合中的$addToSet
操作),也會返回修改后的計數。
只要您的MongoDB服務器版本足夠新(需要為MongoDB 2.6或更高版本)並且您的mongoose版本足夠新並且捆綁了最新的mongodb驅動程序,那么您就可以從Bulk Operations API響應中獲取正確的數字。
為此,您可以在模型上調用.collection
訪問器,該訪問器將返回本機驅動程序集合對象:
var bulk = Model.collection.initializeOrderedBulkOp();
bulk.find({ username: username })
.updateOne({ $addToSet : { fruits: "apple" } });
bulk.execute(function(err,result) {
if (err) throw err;
console.log( JSON.stringify( result, undefined, 4 ) );
})
返回的“結果”是符合BulkWriteResult( )規范的對象,該對象或多或少看起來像這樣:
{
"writeErrors" : [ ],
"writeConcernErrors" : [ ],
"nInserted" : 2,
"nUpserted" : 0,
"nMatched" : 3,
"nModified" : 3,
"nRemoved" : 1,
"upserted" : [ ]
}
但特別是,在使用$addToSet
並且成員已經存在的情況下,響應將包含"nMatched": 1
和"nModified": 0
,這是您要查看的結果,確認實際上沒有添加任何內容。
在MongoDB 2.6 Shell中,所有更新和插入方法都嘗試在可用的地方使用此API,並且在連接到較舊的服務器時僅回退到舊版實現。 因此,如果您在具有現代服務器的現代外殼中執行此操作,您將看到相同的結果。
希望貓鼬本身將被更改為在可用的情況下也使用這些方法,並提供對相同響應的訪問。 這似乎是未來的方式,但是代碼庫尚未趕上並利用它。
注意 :訪問集合對象后使用任何本機驅動程序方法時要注意的一件事是,確保貓鼬在調用時與數據庫具有活動連接。 貓鼬通過排隊任何請求直到實際建立連接來隱藏它。
因此,如果直接使用集合對象方法,則可能需要確保在執行該代碼之前,等待連接上的“ open”事件。
“受影響的數量是更新的文檔數量,即使新值相同。這直接來自mongo。” 我從這個論壇帖子中得到了這個: https : //github.com/LearnBoost/mongoose/issues/867
這意味着在更新之前,您必須提出另一種方法來確定數組中是否缺少該元素。 我建議在更新之前提取所有文檔並對其進行遍歷。 顯然這並不理想,但我認為沒有其他方法可以做到。
希望這可以幫助。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.