Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/459.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript js使用对象比较两个数组_Javascript_Arrays_Node.js_Mongodb - Fatal编程技术网

Javascript js使用对象比较两个数组

Javascript js使用对象比较两个数组,javascript,arrays,node.js,mongodb,Javascript,Arrays,Node.js,Mongodb,我需要从我的mongo db中删除所有文档,它不存在于包含对象的新数组中。 所以我有一个数组,其中包含如下对象: 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'}]; 我有一个带有db值的数组,它是通过

我需要从我的mongo db中删除所有文档,它不存在于包含对象的新数组中。 所以我有一个数组,其中包含如下对象:

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'}];
我有一个带有db值的数组,它是通过调用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();
        });
    }

});
但它会阻塞整个应用程序,而且速度非常慢,因为我的项目数组和数据库中也有大约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
    });
});
var removeIds=[];
//产品拆卸周期
async.each(产品、函数(dbProduct、回调){
对于(变量i=0;i
它大约需要11秒(阻止整个网络应用程序),对我来说需要12362878个周期。
所以也许有人能给我一些建议?

在你可能遇到的许多问题中,从我的头脑中,你可能想从改变这一点开始:

Product.remove({ _id: dbProduct._id }, function (err) {
        if (err) return updateDBCallback(err);
        callback();
});
.each()
调用中,您将为要删除的每个元素对数据库进行一次调用。最好将所有id存储在one数组中,然后进行单个查询以删除该数组中具有_id的所有元素。像这样

Product.remove({ _id: {$in: myArrayWithIds} }, function (err) {
        if (err) return updateDBCallback(err);
        callback();
});
另一方面,由于
async
将同步执行,node.js确实提供了
setImmediate()
(docs),它将从事件循环中执行函数。因此,基本上您可以“暂停”新元素的执行,并为任何传入请求提供服务,以模拟“非阻塞”处理。

异步库不会以异步方式执行同步代码

对于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
    });
});
var removeIds=[];
//产品拆卸周期
async.each(产品、函数(dbProduct、回调){
对于(变量i=0;i
对不起,乍一看我没有提到return callback();。是的。它工作得很好。但是它会在一段时间内阻止整个web应用吗?我没有能力检查它在你的系统上的功能。如果你测试它,但它仍然很慢,请确保返回一些计时(哪些命令需要多长时间等),因此,我做了一些检查:它的工作速度比以前快,但它大约需要11秒,并且需要12 362 878个周期。因此它会阻止我的应用程序11秒:(在代码中或执行
Product.remove
调用时会花费那么多时间吗?@MeetJoeBlack添加了一个小注释,让您知道如何模拟非阻塞执行,从而不会停止处理新请求。您有两个数组,一个选项是将items数组转换为散列,每个键都是id。因此,不要迭代在每个dbProduct的项目数组all上,您可以执行类似于
items[dbProduct.product.id]
的操作,并获取具有该id的项目