$ elemMatch并更新

cyb*_*bat 2 mongoose mongodb

我想更新使用$ elemMatch获取的子文档.我在网上发现了一些帖子但到目前为止我无法让它上​​班.这就是我所拥有的:

架构:

var user = {
  _id: ObjectId
  addresses: [{
    _id: ObjectId
    street: String
  }]
};
Run Code Online (Sandbox Code Playgroud)

码:

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) {
          ...
Run Code Online (Sandbox Code Playgroud)

以上结果将导致地址子文档被删除,并重新创建一个空白的新文档.如何保存doc/subdoc?

我的目标是能够通过子文档(地址)ID获取文档(用户),修改一个匹配的地址然后保存它.

Joh*_*yHK 11

您可以update通过模型上的单个调用完成所有操作,而不是首先使用findOne以下方式获取它:

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

这将使用位置$操作$set目标仅仅addresses是在查询匹配的元素.

  • @ogborstad不,更新中的`$`只针对`address`元素,`_id`与`address_id`匹配,因为它是查询的一部分. (3认同)
  • 这是危险的,因为@kailashyogeshwar说.如果街道数组中有多个元素,则它们都将被更新. (2认同)