如何在MongoDB中使用多个条件更新多个文档?

3

我有一个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的四个文档都会更新其名称字段。

现在,一种更新汽车的方法是在数组上使用async.each并在这两个文档上应用async.each。这是更冗长的方法。我希望如果我对这两个数组使用一个async.each,并且可以将两个文档压缩在一个查询中,那么代码看起来会更优雅。 我已经浏览了好几页,仍然没有找到想要的内容,想知道在mongo中是否可能实现这一点?


你能提供预期的输出吗?我不确定我理解你想要实现什么。 - undefined
你试过 $each 吗? - undefined
@Yogesh $each是一个数组更新操作。我想要更新由req.body字段中的数组所表示的每个文档。 - undefined
2个回答

2

首先,您可能需要将汽车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的情况下工作。就像你说的那样...“可能”。 - undefined

1

在更新时,尝试在查找查询中使用mongodb的$in。请参见以下查询:

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

这样,您需要运行两个查询来更新名称。
请查看$in-doc以了解更多用途。
希望这能帮助到您。

1
我认为在Mongoose中,new : true不适用于update函数。它适用于findOneAndUpdate()函数。 - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接