如何在mongodb中删除N个文档

17 浏览
0 Comments

如何在mongodb中删除N个文档

在我的集合中,文档包含类似状态和时间戳的关键字。当我想要找到最新的十个文档时,我会编写以下查询语句:

db.collectionsname.find().sort({"timestamp":-1}).limit(10)

这个查询语句给出了我想要的结果,但是当我想要删除最新的十个文档时,我写了以下查询语句:

db.collectionsname.remove({"status":0},10).sort({"timestamp":-1})

但是它显示以下错误:

TypeError: 无法调用未定义的 'sort' 方法

然后我又写了相同的查询语句如下:

db.collectionsname.remove({"status":0},10)

它只删除了一个文档。那么我如何编写一个查询语句,删除十个最新的文档并按时间戳排序呢?

0
0 Comments

问题的原因:需要删除MongoDB中的N个文档,但使用给出的方法会导致多次调用删除操作,效率较低。

解决方法:可以将删除操作整合为一个批处理操作,以提高效率。

以下是优化后的代码:

const bulk = db.collectionName.initializeUnorderedBulkOp();
db.collectionName.find().limit(N).forEach(doc => {
    bulk.find({_id: doc._id}).removeOne();
});
bulk.execute();

这样,只需一次调用来删除N个文档,效率更高。

这个解决方法非常有用,特别是当你在开发数据库中有大量文档,并且只想保留其中的一部分时。你可以让它在夜间运行清理任务,而不是打印出所有需要删除的文档的_id,然后逐个提交删除请求(可能需要分批进行)。

希望这个解决方法对你有帮助!

0
0 Comments

问题的出现原因是使用新的MongoDB Shell(mongosh)在MongoDB 5.0上执行删除操作时出现了循环依赖错误。解决方法是在.map之前添加.toArray()

以下是解决方法的代码示例:

db.collection.remove({_id: 
    { $in: db.collection.find().sort({timestamp:-1}).limit(100).toArray().map(a => a._id) }
})

这样就可以成功删除MongoDB中的N个文档。无论是在MongoDB命令行客户端还是使用新的MongoDB Shell(mongosh),这种方法都适用。

0
0 Comments

问题的出现原因是在mongodb中,使用remove或findAndModify时无法设置限制数量。因此,如果你想精确地限制删除的文档数量,需要分两步来进行操作。首先,使用find方法查询出满足条件的文档,并使用limit方法限制返回的文档数量,再使用sort方法按照指定的字段进行排序,使用toArray方法将查询结果转换为数组,并使用map函数提取出其中的_id字段。然后,将提取出的_id数组作为参数,传递给remove方法,即可删除指定数量的文档。

解决方法如下:

1. 使用find方法查询满足条件的文档,并使用limit方法限制返回的文档数量,sort方法按照指定字段进行排序,将结果转换为数组,并提取出其中的_id字段。

db.collectionName.find({}, {_id : 1})
    .limit(100)
    .sort({timestamp:-1})
    .toArray()
    .map(function(doc) { return doc._id; });  // Pull out just the _ids

2. 将提取出的_id数组作为参数,传递给remove方法,即可删除指定数量的文档。

db.collectionName.remove({_id: {$in: removeIdsArray}})

需要注意的是,在capped collection中无法删除文档。

另外,如果要删除的文档数量较大,可能会出现错误:"Converting from JavaScript to BSON failed: Object size 19888938 exceeds limit of 16793600 bytes."

0