删除大小大于特定值的文档
Delete document that has size greater than a specific value
我有一个集合,其中包含多个文档,其大小已从 16MB 增加或即将达到 16MB。
我想要查找大小大于 10MB 的文档并将其全部删除的查询。
我正在使用以下方法查找文档的大小。
Object.bsonsize(db.test.findOne({type:"auto"}))
有没有办法将此查询嵌入到 db.test.deleteMany()
查询中?
我认为你必须这样做:
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 } });
以下查询删除大小大于指定大小的文档(大小以字节为单位指定)。此查询适用于 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 } } )
我有一个集合,其中包含多个文档,其大小已从 16MB 增加或即将达到 16MB。 我想要查找大小大于 10MB 的文档并将其全部删除的查询。
我正在使用以下方法查找文档的大小。
Object.bsonsize(db.test.findOne({type:"auto"}))
有没有办法将此查询嵌入到 db.test.deleteMany()
查询中?
我认为你必须这样做:
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 } });
以下查询删除大小大于指定大小的文档(大小以字节为单位指定)。此查询适用于 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 } } )