2014-08-29 27 views
0

我想更新使用$ elemMatch獲取的子文檔。我在網上發現了一些帖子,但到目前爲止我無法使其工作。這是我有:

模式:

var user = { 
    _id: ObjectId 
    addresses: [{ 
    _id: ObjectId 
    street: String 
    }] 
}; 

代碼:

this.findOne({ 
    'addresses._id': address_id 
}, { 'occurrences': { $elemMatch: { 
    '_id': address_id 
}}}) 
    .exec(function(err, doc) { 
    if (doc) { 
     // Update the sub doc 
     doc.addresses[0].street = 'Blah'; 

     doc.update({ 'addresses': { $elemMatch: { '_id': address_id }}}, { $set: {"addresses.$.street": doc.addresses[0].street }}) 
     .exec(function(err, count) { 
      ... 

在地址子文檔上述結果被殲滅和空白新的重建。我怎樣才能保存doc/subdoc?

我的目標是能夠通過子文檔(地址)ID獲取文檔(用戶),修改一個匹配的地址然後保存它。

回答

7

你可以做到這一切與一個update呼叫模型,而不是與findOne先取出它:

User.update(
    {'addresses._id': address_id}, 
    {$set: {'addresses.$.street': 'Blah'}}, 
    function(err, count) { ... }); 

它使用在$setpositional $ operator的目標只是在匹配的addresses元素查詢。

+1

如果有多個對象,則不會更新。 – 2016-11-15 13:30:40

+1

@kailashyogeshwar說這很危險。如果街道數組中有多個元素,則它們都將被更新。 – ogborstad 2016-12-02 09:57:28

+2

@ogborstad不,更新中的'$'只針對'_id'與'address_id'匹配的'addresses'元素,因爲這是查詢的一部分。 – JohnnyHK 2016-12-02 13:26:10