我需要从我的 mongo 数据库中删除所有文档,这些文档不存在于带有对象的新数组中。 所以我有一个包含以下对象的数组:
var items = [
{product_id:15, pr_name: 'a', description : 'desc'},
{product_id:44, pr_name: 'b', description : 'desc2'}
{product_id:32, pr_name: 'c', description : 'desc3'}];
我有一个包含数据库值的数组,这些值是通过调用Model.find({})获得的。 所以现在我以“直接”的方式来做:
async.each(products, function (dbProduct, callback) { //cycle for products removing
var equals = false;
async.each(items, function(product, callback){
if (dbProduct.product_id === product.product_id){
product.description = dbProduct.description;// I need to save desc from db product to new product
equals = true;
}
callback();
});
if (!equals) {
log.warn("REMOVE PRODUCT " + dbProduct.product_id);
Product.remove({ _id: dbProduct._id }, function (err) {
if (err) return updateDBCallback(err);
callback();
});
}
});
但是它会阻塞整个应用程序并且速度非常慢,因为我的 items 数组和数据库中也有大约 5000 个值。所以它的循环数非常大。 也许有更快的方法?
更新1 使用下面的代码,来自 TbWill4321 答案:
var removeIds = [];
// cycle for products removing
async.each(products, function (dbProduct, callback) {
for ( var i = 0; i < items.length; i++ ) {
if (dbProduct.product_id === product.product_id) {
// I need to save desc from db product to new product
product.description = dbProduct.description;
// Return early for performance
return callback();
}
}
// Mark product to remove.
removeIds.push( dbProduct._id );
log.warn("REMOVE PRODUCT " + dbProduct.product_id);
return callback();
}, function() {
Product.remove({ _id: { $in: removeIds } }, function (err) {
if (err) return updateDBCallback(err);
// Continue Here.
// TODO
});
});
它需要大约 11 秒(阻止整个网络应用程序)并且对我来说需要 12 362 878 个周期。 那么也许有人可以给我一些建议?
最佳答案
异步库不以异步方式执行同步代码。
对于 JavaScript 来说,5000 个项目并不是一个巨大的数字,因为我已经研究了超过 500 万个点的大数据集,并且不需要很长时间。您可以通过如下结构获得更好的性能:
var removeIds = [];
// cycle for products removing
async.each(products, function (dbProduct, callback) {
for ( var i = 0; i < items.length; i++ ) {
if (dbProduct.product_id === product.product_id) {
// I need to save desc from db product to new product
product.description = dbProduct.description;
// Return early for performance
return callback();
}
}
// Mark product to remove.
removeIds.push( dbProduct._id );
log.warn("REMOVE PRODUCT " + dbProduct.product_id);
return callback();
}, function() {
Product.remove({ _id: { $in: removeIds } }, function (err) {
if (err) return updateDBCallback(err);
// Continue Here.
// TODO
});
});
关于javascript - Node.js 将两个数组与对象进行比较,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33903889/