B基于每个MongoDB文档的大小

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

我想知道大约50个文档的BSON大小。我怎么做呢?是否有任何查询命令可以执行此操作

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()
没有多少帮助。