【问题标题】:How to update multiple documents with multiple condtions in MongoDB?如何在 MongoDB 中更新具有多个条件的多个文档?
【发布时间】:2017-01-11 17:49:39
【问题描述】:

我有一个包含各种文档的 MongoDB 集合。现在,我在要更新的汽车数组中有输入文档 ID。像这样。

req.body = 
{ cars: [ '584cf6c126df866138a29408', '5852819e9693c27c136104bd' ],
    name: 'Home' },
{ cars: [ '584d638242795854a091cbbf', '5842e09e372b786355ba50e7' ],
    name: 'Office' } ]

预期操作

db.cars.update({_id : req.body[i].cars}, {name : req.body[i].name}, {new : true});

预期结果
所有四个具有 id 的文档都使用文档中的 name 字段进行更新。

现在更新汽车的一种方法是在数组上应用 async.each 并在这两个文档上应用 aysnc.each。这是更长的方法。我希望如果我有一个 async.each 用于这两个数组,并且可以以某种方式将两个文档压缩在一个查询中,它会使代码看起来更优雅。 我已经浏览了几页,但仍然没有找到任何想知道这在 mongo 中是否可行的信息?

【问题讨论】:

  • 你能提供预期的输出吗?我不确定你想达到什么目的
  • 你试过了吗$each
  • @Yogesh $each 是一个数组更新操作。我想更新 req.body 字段中的数组表示的每个文档。

标签: mongodb


【解决方案1】:

首先您可能需要将您的汽车 ID String 类型转换为 mongodb ObjectId 这意味着:

cars: [ ObjectId'584cf6c126df866138a29408'), ObjectId'5852819e9693c27c136104bd') ]

然后使用$in 运算符来匹配文档。

可以试试这个。

var ObjectId = require('mongodb').ObjectID;
var cars = req.body[i].cars.map(function (id) {
  return new ObjectId(id);
})

db.cars.update({_id : {$in: cars}}, 
  {$set : {name : req.body[i].name}},
  {multi : true},
  function(err, docs) {
    console.log(docs);
});

【讨论】:

  • 它也可以在不更改对象 ID 的情况下工作。正如你所说......“可能”
【解决方案2】:

在进行更新时尝试在查找查询中使用 mongodb 的 $in。请参阅下面的查询:

Model.update({_id : {$in: req.body[i].cars}}, 
 {$set : {name : req.body[i].name}},
 {multi : true});

因此,您必须运行 2 个查询来更新名称。

查看$in-doc了解更多用途。

希望这会对你有所帮助。

【讨论】:

  • 我认为 new : true 不适用于 Mongoose 中的更新功能。它适用于 findOneAndUpdate()。
猜你喜欢
  • 2020-03-18
  • 2017-02-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-09-19
  • 2019-05-22
  • 2021-02-16
  • 1970-01-01
相关资源
最近更新 更多