MongoDB使用新的文档数组更新文档数组

时间:2017-10-17 21:35:41

标签: javascript mongodb

可以插入一个对象数组,但不能更新它们。您必须删除它们然后插入它们。我不想删除然后插入它们,因为如果删除顺利但插入有错误,则数据会丢失。如何正确更新集合中的数组(所有文档)?

插入文件数组:

collection.insert(arrToInsert, function(err, results){
    console.log(results.ops);
});

更新插入的数组(不好):

collection.remove({}, function(err){
    collection.insert(arrUpdated, function(err, result) {
        console.log(results.ops);
    });
});

我尝试过使用collection.update,但这不允许使用数组。

编辑: 例如: 插入此数组:

[
    {_id:0,name:"Harry"},
    {_id:1,name:"Jacob"},
    {_id:2,name:"Bob"}
]

然后,将其更改为:

[
    {_id:0,name:"Dennis"},
    {_id:1,name:"Peter"},
    {_id:2,name:"Ghandi"}
]

我的实际情况有点复杂,因为数组有另一个键/值对,并且可以通过多种方式进行更改。

1 个答案:

答案 0 :(得分:1)

您的意思是.bulkWrite(),它允许在单个批处理请求中对同一集合进行多次更新操作(插入/更新/删除)。实际上,当使用文档数组调用.insert().insertMany()时,现代驱动程序真正调用它。

您的新更新将是:

var arrToUpdate = [
    {_id:0,name:"Dennis"},
    {_id:1,name:"Peter"},
    {_id:2,name:"Ghandi"}
];

collection.bulkWrite(
  arrToUpdate.map( d => ({
    "replaceOne": {
      "filter": { "_id": d._id },
      "replacement": d
    }
  })),
  function(err,result) {
    console.log(result)
  }
)

replaceOne基本上是"更新"不使用任何修饰符,例如$set

关键是,就像带有数组.insert()的{​​{1}}一样,数据库只接收一个请求和响应,但该请求中有多个操作。< / p>