在查找期间从集合中删除文档

时间:2016-04-21 17:29:24

标签: mongodb

如何在迭代期间(使用游标)删除文档?

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
} );

虽然后者确实有效,但似乎在已经拥有该文档之后进行搜索会显着减慢该过程。 (我错了吗?)

2 个答案:

答案 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>
});

此功能将返回已删除的文档,您可以使用该文档进行打印。你可以循环它,直到不再留下任何文件。

修改

您可以采用的另一种方法是使用findbulkWrite(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>
    }
]);

bulkWrite() - MongoDB