gpt4 book ai didi

node.js - Mongoose 多更新

转载 作者:可可西里 更新时间:2023-11-01 09:07:43 25 4
gpt4 key购买 nike

我想用不同的值更新多个文档。

我的数据库看起来像这样。

[
{
"_id": 1,
"value": 50
},
{
"_id": 2,
"value": 100
}
]

此查询返回错误,因为我传递的是数组而不是 $set 中的对象。

    Model.update({_id: {$in: ids}}, {$set: ids.value}, {multi: true};

我希望我的数据库看起来像这样

[
{
"_id": 1,
"value": 4
},
{
"_id": 2,
"value": 27
}
]

最佳答案

假设你有一个对象数组,你想在你的集合中更新匹配的 id,比如

var soldItems = [
{
"_id": 1,
"value": 4
},
{
"_id": 2,
"value": 27
}
];

那么你可以使用 forEach() 数组上的方法来迭代它并更新您的集合:

soldItems.forEach(function(item)){
Model.update({"_id": item._id}, {"$set": {"value": item.value }}, callback);
});

或使用 promises 作为

var updates = [];
soldItems.forEach(function(item)){
var updatePromise = Model.update({"_id": item._id}, {"$set": {"value": item.value }});
updates.push(updatePromise);
});

Promise.all(updates).then(function(results){
console.log(results);
});

或使用 map()

var updates = soldItems.map(function(item)){
return Model.update({"_id": item._id}, {"$set": {"value": item.value }});
});

Promise.all(updates).then(function(results){
console.log(results);
});

对于更大的数组,您可以利用批量写入 API 来获得更好的性能。对于支持 MongoDB Server 3.2.x 的 Mongoose 版本 >=4.3.0,你可以使用 bulkWrite() 更新。以下示例显示了您可以如何执行此操作:

var bulkUpdateCallback = function(err, r){
console.log(r.matchedCount);
console.log(r.modifiedCount);
}
// Initialise the bulk operations array
var bulkOps = soldItems.map(function (item) {
return {
"updateOne": {
"filter": { "_id": item._id } ,
"update": { "$set": { "value": item.value } }
}
}
});

// Get the underlying collection via the native node.js driver collection object
Model.collection.bulkWrite(bulkOps, { "ordered": true, w: 1 }, bulkUpdateCallback);

对于支持 MongoDB Server >=2.6.x 的 Mongoose 版本 ~3.8.8, ~3.8.22, 4.x,您可以使用 Bulk API 如下

var bulk = Model.collection.initializeOrderedBulkOp(),
counter = 0;

soldItems.forEach(function(item) {
bulk.find({ "_id": item._id }).updateOne({
"$set": { "value": item.value }
});

counter++;
if (counter % 500 == 0) {
bulk.execute(function(err, r) {
// do something with the result
bulk = Model.collection.initializeOrderedBulkOp();
counter = 0;
});
}
});

// Catch any docs in the queue under or over the 500's
if (counter > 0) {
bulk.execute(function(err,result) {
// do something with the result here
});
}

关于node.js - Mongoose 多更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35209401/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com