Javascript js使用对象比较两个数组
我需要从我的mongo db中删除所有文档,它不存在于包含对象的新数组中。 所以我有一个数组,其中包含如下对象: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值的数组,它是通过
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的项目