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

Dan*_*iel 6 mongodb

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

db.users.find().forEach(function(myDoc) {
    print( "user: " + myDoc.name );
    // now I'm done with it
    myDoc.remove(); // <-- this doesn't work
} );
Run Code Online (Sandbox Code Playgroud)

有没有一种方法可以做到这一点而无需进行单独的搜索?

db.users.find().forEach(function(myDoc) {
    print( "user: " + myDoc.name );
    // now I'm done with it
    db.users.findOneAndDelete(myDoc); // <-- this does work
} );
Run Code Online (Sandbox Code Playgroud)

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

Lak*_*age 5

您可以首先搜索对象并将_id保存在数组中。然后使用以下代码一次删除所有元素。

db.users.deleteMany(
      { "_id": {$in:idArray} },
      function(err, results) {

      }
   ); 
Run Code Online (Sandbox Code Playgroud)

编辑

我找到了一种批量方法来做到这一点。

var bulk = db.users.initializeUnorderedBulkOp();
bulk.find( { "_id": {$in:idArray} }).remove();
bulk.execute();
Run Code Online (Sandbox Code Playgroud)

根据我的经验,如果使用批量操作,您可以将执行时间缩短 10 倍以上,因为它减少了 IO 操作。