gpt4 book ai didi

node.js - 这是在 mongodb 中插入和更新对象数组的安全方法吗?

转载 作者:可可西里 更新时间:2023-11-01 10:02:51 24 4
gpt4 key购买 nike

以下代码更新指定对象的数组,如果对象不在数据库中则插入。它工作正常,但我是 mongodb 的新手,我不确定这是安全还是快速的方法。

也许我应该使用 updateMany ?我尝试使用它,但无法获得与以下代码相同的行为。

mongodb.connect(mongo_url, function(err, db) {
if(err) console.log(err)
else {
var mongo_products_collection = db.collection("products")

mongoUpsert(mongo_products_collection, data_products, function() {
db.close()
})
}
})

function mongoUpsert(collection, data_array, cb) {
var data_length = data_array.length

for (var i=0; i < data_length; i++) {
collection.update(
{product_id: data_array[i].product_id},
data_array[i],
{upsert: true}
)
}

return cb(false)
}

最佳答案

使用 bulkWrite 执行更新的 API 可以更好地处理这个问题

mongodb.connect(mongo_url, function(err, db) {
if(err) console.log(err)
else {
var mongo_products_collection = db.collection("products")

mongoUpsert(mongo_products_collection, data_products, function() {
db.close()
})
}
})

function mongoUpsert(collection, data_array, cb) {

var bulkUpdateOps = data_array.map(function(data) {
return {
"updateOne": {
"filter": {
"product_id": data.product_id,
"post_modified": { "$ne": data.post_modified }
},
"update": { "$set": data },
"upsert": true
}
};
});

collection.bulkWrite(bulkUpdateOps, function(err, r) {
// do something with result
});

return cb(false);
}

如果您正在处理更大的阵列,即 > 1000,那么请考虑以 500 个为一批将写入发送到服务器,这会给您带来更好的性能,因为您不会将每个请求都发送到服务器,每 500 个请求只发送一次。

对于批量操作,MongoDB 强加一个 default internal limit每批 1000 个操作,因此选择 500 个文档是好的,因为您可以控制批大小而不是让 MongoDB 强加默认值,即对于 > 1000 个文档的更大操作。因此,对于第一种方法中的上述情况,可以一次写入所有数组,因为它很小,但 500 的选择适用于较大的数组。

var ops = [],
counter = 0;

data_array.forEach(function(data) {
ops.push({
"updateOne": {
"filter": {
"product_id": data.product_id,
"post_modified": { "$ne": data.post_modified }
},
"update": { "$set": data },
"upsert": true
}
});
counter++;

if (counter % 500 == 0) {
collection.bulkWrite(ops, function(err, r) {
// do something with result
});
ops = [];
}
})

if (counter % 500 != 0) {
collection.bulkWrite(ops, function(err, r) {
// do something with result
}
}

关于node.js - 这是在 mongodb 中插入和更新对象数组的安全方法吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38997511/

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