B基于每个MongoDB文档的大小
我想知道大约50个文档的BSON大小。我怎么做呢?是否有任何查询命令可以执行此操作B基于每个MongoDB文档的大小,mongodb,mongodb-query,aggregation-framework,Mongodb,Mongodb Query,Aggregation Framework,我想知道大约50个文档的BSON大小。我怎么做呢?是否有任何查询命令可以执行此操作 db.getCollection("some_collection").aggregate([ {"$match": {}}, {"$limit": 50}, {"$project": { "_id": 1, "created_at": "$created_at", "updated_at": "$up
db.getCollection("some_collection").aggregate([
{"$match": {}},
{"$limit": 50},
{"$project":
{
"_id": 1,
"created_at": "$created_at",
"updated_at": "$updated_at",
"size": Object.bsonsize("$updated_at"), // This line is not runnable
}
}
])
解决方案 我在这里更新解决方案,因为这个问题被主持人错误地标记为重复
db.getCollection("some_collection").find({}).limit(50).sort({"_id": -1}).forEach(doc => {
const size = Object.bsonsize(doc);
print(doc._id, size)
})
我认为这是不可能的,因为MangoDb为文档添加了一个额外的缓冲区,以允许它们增长 因此,文档的大小与磁盘上文档的大小不同 然而,我发现在很多情况下,仅仅使用db.collectionName.stats()就足够了 请参见下图中的输出示例
您使用聚合查询而不是查找是否有任何原因?如果它只有50个文件大小,我会。希望这样做
Object.bsonsize(db.some\u collection.find({})。选择(“created\u at updated\u at”))。限制(50)
Object.bsonsize
是一个JavaScript操作符。因此,不,您不能使用聚合框架来实现这一点。最好的选择是循环收集结果,并将当前文档对象传递给该函数,就像现有示例一样。您可以使用mapReduce
,因为这是通过JavaScript实现的,但是对于本质上只是迭代的内容来说,这将是一个毫无意义的练习,除非您打算“按大小分组”或类似操作。@SaikatChakrabortty我想要每个文档的大小,而不是所有文档的大小。@NeilLunn您是对的。似乎我需要mapReduce
或一些函数来实现这一点。但是,您可以删除重复的标志吗?这两个链接都与此问题相关,但不是此问题的确切答案。您确实不想要mapReduce
,除非我已经说明您确实需要一些“还原”,而您的问题中没有说明这一点。现有答案直接解决了您的问题。正如所有这些示例所示,一个“列表”只是从迭代中获得的。在这个集合中,每个文档的大小可能会有很大的不同,因此db.collectionName.stats()
没有多少帮助。