目前我有一个 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);
});
}
});
非常感谢任何帮助