2016-06-11 76 views
0

考慮以下

用戶採集樣品&用戶文檔

{ 
"_id" : ObjectId("575c01f7b8e5999addeb598c"), 
"username" : "[email protected]", 
"password" : "<password>", 
"firstName" : "Test, 
"lastName" : "User" 
} 

我試圖運行的更新請求加入其目的是要在userData.eventData條目是一個數組

在蒙戈腳本我可以做

> db.Users.update({_id: ObjectId("575c01f7b8e5999addeb598c")}, {"$addToSet":{"userData.eventData":"My event"}}) 

我有以下結果:用戶數據被(使用驅動程序版本2.1.21)

// with a properly initialized db object 
db.collection("Users").update({"_id" : ObjectId("575c01f7b8e5999addeb598c")}, {"$addToSet": { "userData.eventData": "My Event"}}, function(err, result) { 
    // do something 
}); 

我爲對象和EVENTDATA作爲嵌套陣列

WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 }) 
> db.Users.find({_id: ObjectId("575c01f7b8e5999addeb598c")}) 
{ "_id" : ObjectId("575c01f7b8e5999addeb598c"), "username" : "[email protected]", "password" : "<password>", "firstName" : "Test", "lastName" : "User", "userData" : { "eventData" : [ "My event" ] } } 

當運行在蒙戈相同的邏輯創建收到以下回應

result:Object 
    n:0 
    nModified:0 
    ok:1 

實際上數據庫條目沒有改變。

難道這就是它的行爲方式嗎?我可以很容易地通過創建userData.eventData陣列解決這個問題,但我發現令人不安的事實是節點的蒙戈司機和蒙戈外殼並沒有表現在這

由於同在您的幫助&建議

編輯13/6/16 錯誤是在我的身邊,我錯過了一個'新'之前的'ObjectId(...'在節點。它的行爲完全一樣,在mongo殼(即'userData'創建作爲一個對象,它包括'eventData'數組)

沒問題,然後:)

+1

'n:0'表示你的更新沒有找到匹配的文件,所以你可能會查詢錯誤的數據庫或類似的東西。 – JohnnyHK

+0

的確,訣竅是在節點代碼中的ObjectId前添加一個'new'。非常感謝@JohnnyHK(我編輯了我的原始文章) – Boris

回答

0

Update,更新文檔中已有的對象。 你想要的是insert或使用心煩它創建時沒有文檔的查詢條件

db.collection.update(
    { name: "Andy" }, 
    { 
     name: "Andy", 
     rating: 1, 
     score: 1 
    }, 
    { upsert: true } 
); 

如果你想一個對象添加到您的陣列相匹配的新文件,你需要$推動

// Insert a document in the capped collection 
function push (db, collection, search, data, callback) { 
    db.collection(collection).update(
     search, { 
      $push: data 
     }, function (err, result) { 
      console.log("New object pushed"); 
      callback(err); 
     }); 
} 
+0

感謝@John的回覆。實際上,我想通過將數據添加到嵌套在實際子文檔中的數組中來更新現有文檔。我的用戶對象將被構造爲{username:「Andy」,「userData」:{「eventData」:[「my event」]}}。我使用$ addToSet,但可以使用$ push(我相信在這種情況下它們的行爲相同)。我的問題是可能創建「userData」和「eventData」結構,最初可能爲空。我的錯誤是由於在節點中的ObjectID()之前缺少「新」 – Boris