如何在MongoDB中更新多个condtions的多个文档?

时间:2017-01-10 09:43:57

标签: mongodb

我有一个包含各种文档的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,在这两个文档上应用aysnc.each。这样做的时间越长。我希望如果我有两个async.each用于这两个数组,并且不知何故可以在单个查询中扼杀两个文档,这将使代码看起来更优雅。 我已经浏览了几页但仍未找到任何想知道mongo是否可行的内容?

2 个答案:

答案 0 :(得分: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);
});

答案 1 :(得分:1)

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

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

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

请参阅$in-doc以了解有关用途的更多信息。

希望这会对你有所帮助。