簡體   English   中英

MongoDB:更新計數不正確

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM