2016-03-01 7 views
3

我注意到MongoDB的node.js的司機findOneAndUpate()一個奇怪的行爲現場...的MongoDB Node.js的驅動器 - findOneAndUpdate()行爲不給予

我誤把它只是一個字符串對象ID思維....它會默認爲一個文件_id領域搜索....所以,當我用

User.prototype.updatePetArray = function(user, petElement) { 
    return this.collection.findOneAndUpdate(user, 
    { $push: { pets: petElement } }, 
    { returnOriginal: false, 
     maxTimeMS: QUERY_TIME}); 
} 

它拉起,修改這個文件,不具有這個數字在所有:

{ "_id" : ObjectId("56d4e2a381c9c28b3056f792"), "username" : "bob123", "location" : "AT", ...} 

爲什麼會修改這個文件時56d4d35881c9c28b3056f78a不是文檔中?

回答

3

後,我測試它與下面的代碼一個非存在ObjectID

var col = db.collection('users'); 
    col.findOneAndUpdate('56cd129222222', {fname: 'Daved'}, function(err, r) { 
    if (err) 
     console.log(err); 
    else 
     console.log(r); 
    db.close(); 
    }); 

結果集合中的第一個文件被改變。

每本doc

findOneAndUpdate(filter, update, options, callback) 

filter:指定空文檔{}更新頭文件返回的收藏。

所以我覺得這不存在ObjectId是考慮到相同的行爲與{}


審查findAndModify源代碼之後,最終的

// Execute the command 
    self.s.db.command(queryObject 

被調用時,而queryObject

var queryObject = { 
    'findandmodify': self.s.name 
    , 'query': query 
    }; 

所以我測試runCommand在蒙戈外殼與非存在ObjectId如下,作爲結果,則返回第一個文件。

> db.users.runCommand({findandmodify: 'users', query: '123ddae344', update: true 
}) 
{ 
     "lastErrorObject" : { 
       "updatedExisting" : true, 
       "n" : 1 
     }, 
     "value" : { 
       "_id" : ObjectId("56c687275d81735019263d1f"), 
       "fname" : "Daved" 
     }, 
     "ok" : 1 
} 
+0

好,感謝確認。在我看來,這種行爲應該改變,因爲它不完全是空的。 – dman

+0

@dman,我不存在蒙戈外殼OBJECTID測試了一下,似乎與'{}'的文件稱相同的行爲。 – zangw

1

該文檔一直說過濾器參數應該是一個對象。

的錯誤行爲很可能的誤解釋的值,作爲一個字符串不是一個對象(也許一個truthy值,非空字符串)的一些副作用。

相關問題