2015-10-06 36 views
1

我正在編寫代碼來管理通過網站使用NodeJS的純MongoDB驅動程序的商家集合。當商家試圖確認他們的賬戶時,我發生了麻煩。預計代碼使用$ unset從數據庫中刪除值,從而激活商家的賬戶。相反,查詢返回true,但確認字段保持不變。這裏是通過db.merchants.find印在數據庫中的問題的商家之一的一個例子({})(添加了換行更好的可讀性):

{ "email" : "[email protected]", "password" : "<hashed password is here>", 
    "salt" : "<salt is here>", "access" : "merchant", 
    "created" : 1444000000000, "confirm" : "bKEQD0aiV8aXIQPY4CUxCm7KGSZ2pFJM", 
    "name" : "Test user", 
    "contact" : { "name" : "Test User", 
    "address" : "123 Cedar Ln N", 
    "city" : "Some City", "state" : "AA", 
    "zip" : "00000", "country" : "USA", 
    "phone" : "5555555555" }, 
    "_id" : ObjectId("56133111d30ce5d4736323cb") } 

AssumEffectively,這是在所使用的JS爲了將該項插入到數據庫:

db.collection("merchants").insert({ 
    name: "Test user", 
    email: "[email protected]", 
    .... more fields...., 
    confirm: "bKEQD0aiV8aXIQPY4CUxCm7KGSZ2pFJM" 
}, someCallback); 

...這裏是我試圖取消設置「確認」字段:

db.collection("merchants").findOne({email: "[email protected]"}, function(err, user) { 
    if(err) return handleError(); 
    if(!user) return sendFailureMessageToClient(); 
    if(client.confirm == user.confirm) { 
     db.collection("merchants").update({_id: user.id}, 
      {$unset: {confirm: true}}, someCallback); 
    } 
} 

我確信,上述更新命令實際上是北ng執行。

我認爲對於上面的數據有趣的事情之一是_id字段在結尾......應該是通常發生的事情嗎?這會搞亂update命令的$ unset嗎?如果這不是問題,那麼是什麼?

在此先感謝您的幫助。

編輯:我展示了爲什麼我使用單獨的findOne請求,然後更新。

回答

0

_id是ObjectId的一個特殊的BSON對象。使用id字符串是不夠的。你可能想使用_id還有:

db.collection("merchants").update({_id: ObjectId(user._id)}, 

您可能還需要使用findAndModify代替。

+0

這似乎沒有幫助...此外,我很確定我使用的user._id已經是ObjectID類型。 – KillerByte

0

您錯過了user.id中的下劃線,應該是user._id。現在,它試圖通過undefined _id獲取用戶。

如果不是這樣,你應該在電子郵件領域做更新,它會工作得很好(假設它是唯一的)。

文檔末尾的_id無關緊要,JSON/BSON字段中沒有嚴格的順序。訂單維護的唯一時刻是數組內部。