删除大小大于特定值的文档

时间:2021-03-10 09:21:17

标签: mongodb mongodb-query nosql

我有一个集合,其中包含大小已从 16MB 增加或即将达到 16MB 的多个文档。 我想要查找大小大于 10MB 的文档并删除所有文档的查询。

我正在使用以下内容来查找文档的大小。

Object.bsonsize(db.test.findOne({type:"auto"}))

有没有办法将这个查询嵌入到 db.test.deleteMany() 查询中?

2 个答案:

答案 0 :(得分:1)

以下查询删除大小大于指定大小(大小以字节为单位)的文档。此查询适用于 MongoDB v4.4 或更高版本

db.collection.deleteMany( { 
    $expr: { $gt: [ { $bsonSize: "$$ROOT" }, SIZE_LIMIT ] }, 
    type: "auto" 
} )

以下脚本针对 MongoDB v4.2 或更早版本运行:
const SIZE_LIMIT = 75 // substitute your value here in bytes
let idsToDelete = [ ]
let crsr = db.collection.find()

while(crsr.hasNext()) {
    let doc= crsr.next()
    if (Object.bsonsize(doc) > SIZE_LIMIT) {
        idsToDelete.push(doc._id)
    }
}

db.collection.deleteMany( { _id: { $in: idsToDelete } } )

答案 1 :(得分:0)

我认为你必须这样做:

db.test.aggregate([
   { $match: { type: "auto" } },
   { $project: { bsonSize: { $bsonSize: "$$ROOT" } } },
   { $match: { bsonSize: { $gt: 16e6 } } },
]).forEach(function (doc) {
   db.test.deleteOne({ _id: doc._id });
})

或者,如果您更喜欢 deleteMany:

var ids = db.test.aggregate([
   { $match: { type: "auto" } },
   { $project: { bsonSize: { $bsonSize: "$$ROOT" } } },
   { $match: { bsonSize: { $lt: 16e6 } } }
]).toArray().map(x => x._id);

db.test.deleteMany({ _id: { $in: ids } });