如何遍历 Mongo Collection 并执行数据库操作

时间:2021-02-26 06:26:10

标签: javascript node.js mongodb

目前我有一个 Mongo Shell 脚本,如果有 500 个或更多,它会删除任何重复项。

db.Documents.aggregate([
{
 $group: {
    _id: { projectId: "$Filename" },
    dups: { $addToSet: "$_id"  },
    count: { $sum: 1 }
 }
},
 {
   $match:
     {
       count: {"$gt": 500}
     }
 }
]).forEach(function(doc) {
   doc.dups.shift();
   db.Documents.remove({
       _id: {$in: doc.dups}
   });
});

此代码在使用 mongo shell 时完美运行。我正在尝试将其转换为通过脚本执行。不幸的是,我遇到了

dbo.collection("Documents").aggregate([{
        $group: {
            _id: {
                projectId: "$Filename"
            },
            dups: {
                $addToSet: "$_id"
            },
            count: {
                $sum: 1
            }
        }
    },
    {
        $match: {
            count: {
                "$gt": 500
            }
        }
    }
]).forEach(function(doc){
    doc.dups.shift();
    var myquery = {
        _id: {
            $in: doc.dups
        }            
    };

    dbo.collection("Documents", function(err, collection) {
       collection.deleteOne(myquery);
    });
   
});

不幸的是,我在尝试执行时遇到了 UnhandledPromiseRejectionWarning: MongoError: pool is draining, new operations prohibited

我理解这个错误,foreach 不是线程友好的,并尝试转换为数组但仍然出现错误。

.toArray(function(err, result){
for (i = 0, count = result.length; i < count; i++) {
    var doc = result[i];
        doc.dups.shift();
        var myquery = {
            _id: {
                $in: doc.dups
            }            
        };

    dbo.collection("Documents", function(err, collection) {
             collection.deleteOne(myquery);
        });
}
});

非常感谢任何帮助

0 个答案:

没有答案
相关问题