【问题标题】:Single update query to update a single document (containing subarray documents)?单个更新查询来更新单个文档(包含子数组文档)?
【发布时间】:2020-12-11 11:54:45
【问题描述】:

我在 DB 中有一个现有文档:

计划集合(在数据库中):

{ _id: ObjectId('XXX'),
  name: 'Plan A', 
  remark: 'YYY',
  products: [ {name: 'Pdt1', qty: '10'}, 
              {name: 'Pdt2', qty: '20'} ]
}

我需要将产品完全更新到下面的“计划 A”文档(不需要与数据库中的现有产品匹配):

{ _id: ObjectId('XXX'),
  name: 'Plan A',
  remark: 'edited YYY',
  products: [ {name: 'Pdt1', qty: '10'},
              {name: 'Pdt3', qty: '30'},
              {name: 'Pdt4', qty: '40'}  ]

问题:

是否有一种简单的 MongoDB 方法来更新现有的“计划 A”文档以 更新 其字段 + 替换 DB 中的所有产品子数组?谢谢

【问题讨论】:

  • 是否有一种简单的 MongoDB 方式如果您正在搜索简单查询,那么您能否添加您在问题中尝试过的复杂查询。
  • @turivishal,我在想是否不需要对现有子数组执行任何“删除”、“插入”、“更新”,而是完全覆盖子数组(无需检查)。不确定您的评论是否说我需要这样做,这对我的问题没有帮助。谢谢
  • 是的,您可以使用$set 替换字段。

标签: mongodb replace sub-array


【解决方案1】:

如果您想替换整个产品子文档,您可以使用 MongoDb 3.6+ 中的 positional all $[] 运算符来完成

var filter = {
    name: 'Plan A'
};

var update = {
    $set: {
        'products.$[]': [ 
            {name: 'Pdt1', qty: '10'},
            {name: 'Pdt3', qty: '30'},
            {name: 'Pdt4', qty: '40'}  
        ]
    }
};

var options = {
    multi: true
};

db.collection.update(filter, update, options);

【讨论】:

  • 谢谢。确实 $set 可以轻松解决问题,我就是这样做的:$set: {remark: req.body.remark, products: req.body.products}。然后它将一起替换整个文档(它的字段+它的子数组)并解决我的问题。
猜你喜欢
  • 2015-12-22
  • 2019-08-02
  • 1970-01-01
  • 1970-01-01
  • 2012-11-26
  • 2017-05-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多