2014-10-05 40 views
1

我有一個分配給一個變量的對象,如:在MongoDB中,如何使用變量中的對象更新數組中的對象?

var child = { 
    { 
     _id: 'ObjectID("16e7f7baa05c3a9d751363")', 
     title: 'Testing', 
     sort: 3, 
     active: true 
    } 

下不工作,老老實實我不確定什麼我失蹤:

db.category.update(
    { _id: "thisistheparentdocumentsid", "children._id": child._id }, 
    { 
     $set: { 
      "children.$.title": child.title, 
      "children.$.active": child.active, 
      "children.$.sort": child.sort 
     } 
    } 
); 

我真正想要的做,因爲我想重複使用這種方法,而不是以後重複自己:

db.category.update(
    { _id: "thisistheparentdocumentsid", "children._id": child._id }, 
    { 
     $set: { 
      "children" : child 
     } 
    } 
); 

這也行不通。我引用這個帖子:Update array element by id with mongo query

除了:http://docs.mongodb.org/manual/reference/operator/update/positional/

但我的查詢是行不通的。我在這裏錯過了些什麼?

---編輯---

下面是結果,當我查詢基於我傳遞數據到服務器,如...方法父文檔

db.category.findOne({ "_id" : "9dYgKdfFczgiRcNouij"}); 
{ 
     "title" : "ParentTest", 
     "active" : true, 
     "children" : [ 
       { 
         "_id" : ObjectId("680d55c6995ef6f0748278c2"), 
         "title" : "ChildTest", 
         "active" : true 
              }, 
       { 
         "_id" : ObjectId("2b4469c1a4c8e086942a1233"), 
         "title" : "ChildTest2" 
         "active" : true 
       } 
     ], 
     "_id" : "9dYgKdfFczgiRcNouij" 
} 

。調用(「UpdateCommand」,id,child);

變量id是文檔的父ID,而孩子是我提到的對象。我使用child._id.toString()來生成匹配的ObjectId(「...」);我使用child._id.toString()生成匹配的ObjectId(「...」);我使用child._id.toString

所以更具體:

db.category.update(
     { _id: id, "children._id": child._id.toString() }, 
     { 
      $set: { 
       "children.$.title": child.title, 
       "children.$.active": child.active, 
       "children.$.sort": child.sort, 
       "children.$.uppercase": child.title.toUpperCase() 
      } 
     } 
    ); 

然而,這是行不通的。我在想我的選擇器是關閉的,但是我可以用相同的方法使用findOne(),它會返回適當的文檔,並使用$ elemMatch返回數組中的指定子項。

任何我可能會丟失的東西?我已經通過console.log運行了所有的值,以確保我能夠得到它們,而我是。

回答

1

所以你說的是,你有這樣的文件:

{ 
    "_id": ObjectId("5430b55d214047b8ee55d40b"), 
    "children": [ 
     { 
      "_id": ObjectID("16e7f7baa05c3a9d751363"), 
      "title": "Testing", 
      "sort": 2, 
      "active": false 
     } 
    } 
} 

或類似的東西,但至少有這樣的孩子組成的數組。只要你高興,更新「所有」如果在你的可變對象的值「子」項的元素再沒有什麼不對的:

db.category.update(
    { "_id": ObjectId("5430b55d214047b8ee55d40b"), "children._id": child._id }, 
    { "$set": { "children.$": child } 
) 

這將替換整個元素位置。

如果你擔心更換整個內容,你可能有這樣的事情:

{ 
    "_id": ObjectId("5430b55d214047b8ee55d40b"), 
    "children": [ 
     { 
      "_id": ObjectID("16e7f7baa05c3a9d751363"), 
      "title": "Testing", 
      "sort": 2, 
      "active": false, 
      "created": ISODate("2014-10-03T03:09:20.609Z") 
     } 
    } 
} 

然後你就可以處理對象的鍵來構建你的$set聲明:

var update = { "$set": {} }; 

for (var k in child) { 
    if (k != "_id") 
     update["$set"]["children.$."+k] = child[k]; 
} 

db.category.update(
    { "_id": ObjectId("5430b55d214047b8ee55d40b"), "children._id": child._id }, 
    update 
); 

哪個會處理更新,但不會覆蓋未提供的「已創建」字段。

另外請注意你的報價''值在ObjectId左右,但我希望這只是一個錯字,否則你需要eval()這個字符串才能得到一個有效的對象。

這裏的單個數組元素僅僅是示例。這是positional $操作符語法,查詢中的匹配元素是重要的。單個數組元素或數百個沒有區別。就像你只更新數組中的一個元素一樣。

+0

我剛剛在我的問題的底部添加了更多詳細信息,字面上與您的答案同時。現在閱讀你的答案,但是如果你願意回顧我的更新? – user1447679 2014-10-05 03:17:57

+0

@ user1447679已經看到了。數組中有多少元素並不重要。我自己的修改反映了這個。如果你的parentId是一個字符串(奇怪的是你在這裏混合類型),那麼它是一個字符串。 – 2014-10-05 03:19:27

+0

我在通過服務器上的更新方法發送之前記錄子對象,它看起來像這樣: Object {_id:「ObjectID(」19636533c66b0fd89f72f4b1「)」,title:「Testing」,sort:2 ,active:true} ObjectID被用引號括起來看起來不正確嗎?我想知道它是否以字符串形式發送。 – user1447679 2014-10-05 03:33:14

相關問題