可以插入一个对象数组,但不能更新它们。您必须删除它们然后插入它们。我不想删除然后插入它们,因为如果删除顺利但插入有错误,则数据会丢失。如何正确更新集合中的数组(所有文档)?
插入文件数组:
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"}
]
我的实际情况有点复杂,因为数组有另一个键/值对,并且可以通过多种方式进行更改。
答案 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>