如何在迭代期间(使用游标)删除文档?
db.users.find().forEach(function(myDoc) {
print( "user: " + myDoc.name );
// now I'm done with it
myDoc.remove(); // <-- this doesn't work
} );
有没有办法在不必单独搜索的情况下完成?
db.users.find().forEach(function(myDoc) {
print( "user: " + myDoc.name );
// now I'm done with it
db.users.findOneAndDelete(myDoc); // <-- this does work
} );
虽然后者确实有效,但似乎在已经拥有该文档之后进行搜索会显着减慢该过程。 (我错了吗?)
答案 0 :(得分:4)
您可以先搜索对象并将 _id 保留在数组中。然后使用以下代码删除所有元素。
db.users.deleteMany(
{ "_id": {$in:idArray} },
function(err, results) {
}
);
修改强>
我找到了一种批量方法来做到这一点。
var bulk = db.users.initializeUnorderedBulkOp();
bulk.find( { "_id": {$in:idArray} }).remove();
bulk.execute();
根据我的经验,如果您使用批量操作,则可以将执行时间缩短10倍以上,因为它可以减少IO操作。
答案 1 :(得分:2)
您可以使用findAndModify
。详细了解here
db.collection.findAndModify({
query: <document>,
remove: <boolean>
});
此功能将返回已删除的文档,您可以使用该文档进行打印。你可以循环它,直到不再留下任何文件。
修改强>:
您可以采用的另一种方法是使用find
和bulkWrite(deleteMany)
。
首先查找并打印所有文档。然后使用bulkWrite操作删除它们。
db.users.find().forEach(function(myDoc) {
print( "user: " + myDoc.name );
});
//This is much faster than your current approach of
//finding and deleting singe documents
db.users.bulkWrite([
{
removeMany: <query>
}
]);