在单个查询中从 mongo 中删除多个文档

Posted

技术标签:

【中文标题】在单个查询中从 mongo 中删除多个文档【英文标题】:Remove multiple documents from mongo in a single query 【发布时间】:2013-09-05 04:06:57 【问题描述】:

我有一个要删除的 mongo '_id' 列表。目前我正在这样做

# inactive_users -->  list of inactive users 
for item in inactive_users:
    db.users.remove('_id' : item)

但我的问题是列表太大...(可能超过 100,000 个)。因此查询列表中的每个项目只会增加服务器的负载。他们是一种在 mongo 查询中传递整个列表的方法,这样我就不必一次又一次地触发查询。

谢谢

【问题讨论】:

【参考方案1】:
db.users.deleteMany('_id':'$in':inactive_users)

【讨论】:

先生,我怎么知道这个操作后删除了多少文件? @LeD.Thang - 它应该告诉你,通过WriteResult( "nRemoved" : ### ) collection.remove 已弃用。请改用collection.deleteMany。文档here【参考方案2】:

全部列出并使用$in 运算符:

db.users.remove(_id:$in:[id1, id2, id3, ... ])

【讨论】:

如果列表确实有 100 000 多个项目,那么您可能希望将其拆分为每次调用几百个批次。【参考方案3】:

您需要使用ObjectId() 以特定格式传递ID:

db.users.remove(_id: $in: [ObjectId('Item1'), ObjectId('Item2'), ObjectId('Item2')]);

Remove 不接受整数 - 您必须使用具有 _id 格式的 ObjectId 实例作为 string

【讨论】:

【参考方案4】:
var collection = db.users;
var usersDelete = [];
var ObjectID = req.mongo.ObjectID;   //req is request from express

req.body.forEach(function(item)     //req.body => ['_id' : ".." , "name" : "john"]
    usersDelete.push(new ObjectID(item._id));
);

collection.remove('_id':'$in': usersDelete,function()
    //res.json(contatos);
);

【讨论】:

【参考方案5】:

我有同样的问题并遇到了这些答案,但似乎 MongoDB 手册建议使用 deleteMany 而不是删除。 deleteMany 返回删除计数以及写入问题的确认(如果操作成功)。

const ids = [id1, id2, id3...];
const query =  _id:  $in: ids ;
dbo.collection("users").deleteMany(query, function (err, obj) 
    if (err) throw err;
);

或者用箭头函数:

const ids = [id1, id2, id3...];
const query =  _id:  $in: ids ;
dbo.collection("users").deleteMany(query, (err, obj) => 
    if (err) throw err;
);

或者更好,有一个承诺:

const ids = [id1, id2, id3...];
const query =  _id:  $in: ids ;
dbo.collection("users").deleteMany(query)
.then(result => 
    console.log("Records Deleted");
    console.log(JSON.stringify(result));
    //for number removed...
    console.log("Removed: " + result["n"]);
)
.catch(err => 
    console.log("Error");
    console.log(err);
);

【讨论】:

以上是关于在单个查询中从 mongo 中删除多个文档的主要内容,如果未能解决你的问题,请参考以下文章

Android KInvey 如何在单个查询中从多个集合中查询详细信息

如何在单个查询中从多个数据库中检索数据?

在一个灵活的查询中从多个表中删除行

在单个查询中使用多个联接

如何在 1 个查询中从 Mongo DB 获取最小值和最大值? C#

查询以从 Spring Data mongo 返回单个字段