如何在迭代期间删除文档(使用光标)?
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)
虽然后者确实有效,但在拥有文档后进行搜索似乎会显着减慢该过程。(我错了吗?)
您可以首先搜索对象并将_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 操作。
| 归档时间: |
|
| 查看次数: |
3387 次 |
| 最近记录: |