javascript - Node.js 将两个数组与对象进行比较

标签 javascript arrays node.js mongodb

我需要从我的 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/

相关文章:

python - 将二维数组中的每个值乘以另一个二维数组中的对应值

c - 如何将文本文件中的值分配给 C 中的数组结构?

node.js - 我可以用 React 中的数据进行服务器渲染吗?

javascript - Dojo 中的日期和时间小部件

javascript - 是否可以在 js 中使用正则表达式来替换几个不同的字符?

javascript - 如何在此 d3 示例中为轴添加标签

javascript - jQuery:从多个父级检索属性并将它们存储到单个数组中

javascript - 当用户登录时,使包含登录表单的下拉菜单消失

javascript - 使用nodejs在mongodb中添加另一个图像路径

node.js - Sequelize : How to define a field as a function?