Mongodb 获取聚合中文档的大小(以字节为单位)
我知道Mongodb 获取聚合中文档的大小(以字节为单位),mongodb,aggregation-framework,Mongodb,Aggregation Framework,我知道Object.bsonsize(),但我不确定它是否适用于我的情况。我想有效地找出我的应用程序中哪些用户拥有最多的总数据,我有一个聚合管道,它使用$lookup将用户的所有文档(分散在其他3个集合中)收集在一起。然后我想要一个管道阶段,看起来像: $project: { "_id": 1, "username": 1, "sizeInBytes": { $sizeInBytes: ... } } 我对聚合相当陌生,所以实际上不确定在siz
Object.bsonsize()
,但我不确定它是否适用于我的情况。我想有效地找出我的应用程序中哪些用户拥有最多的总数据,我有一个聚合管道,它使用$lookup
将用户的所有文档(分散在其他3个集合中)收集在一起。然后我想要一个管道阶段,看起来像:
$project: {
"_id": 1,
"username": 1,
"sizeInBytes": {
$sizeInBytes: ...
}
}
我对聚合相当陌生,所以实际上不确定在sizeInBytes之后,我想要引用整个文档而不仅仅是一个属性
看起来可能在MongoDB 4.0+中,这可以使用
$toString
然后$strLenBytes
来完成,但我很惊讶,我找不到一种内置的方法来更直接地完成这项工作。(不幸的是,我被困在3.6 atm上)不幸的是,即使使用MongoDB 4.0+,计算大小也是非常混乱的,正如您推测的那样,字符串
长度也可以使用。聚合管道中有一个可能的未来功能悬而未决
根据您所拥有的,我建议对$lookup
结果使用Javascript
像这样的例子
db.user.aggregate([
{
$lookup: {
from: "doc1",
localField: "userId",
foreignField: "userId",
as: "doc1arr"
}
},
{
$lookup: {
from: "doc2",
localField: "userId",
foreignField: "userId",
as: "doc2arr"
}
},
{
$lookup: {
from: "doc3",
localField: "userId",
foreignField: "userId",
as: "doc3arr"
}
}
]).map(perUserData => ({ userId: perUserData.userId, size: Object.bsonsize(perUserData) }));
会发出类似的声音
[
{
"userId" : 1,
"size" : 250
},
{
"userId" : 2,
"size" : 350
}
]
请参见上的非js部分,遗憾的是,即使使用MongoDB 4.0+,计算大小也是非常混乱的,正如您推测的那样,可以使用
字符串
长度。聚合管道中有一个可能的未来功能悬而未决
根据您所拥有的,我建议对$lookup
结果使用Javascript
像这样的例子
db.user.aggregate([
{
$lookup: {
from: "doc1",
localField: "userId",
foreignField: "userId",
as: "doc1arr"
}
},
{
$lookup: {
from: "doc2",
localField: "userId",
foreignField: "userId",
as: "doc2arr"
}
},
{
$lookup: {
from: "doc3",
localField: "userId",
foreignField: "userId",
as: "doc3arr"
}
}
]).map(perUserData => ({ userId: perUserData.userId, size: Object.bsonsize(perUserData) }));
会发出类似的声音
[
{
"userId" : 1,
"size" : 250
},
{
"userId" : 2,
"size" : 350
}
]
请参见呃,奇怪的非js部分。好吧,我不打算仅仅为了计数而将一个千兆字节的数据加载到RAM中。幸运的是,我实际上不需要这样做,我只是好奇地想知道哪个用户拥有最多的数据。我想,只需检查少数几个按对象数排名靠前的对象就很容易了。@MalcolmOcean是的,我同意,在MongoDB中使用JS是非常烦人的,但是缺少特性迫使我们在这种情况下这么做。。。对于
docXarr
字段中的对象计数,您当然可以使用Why my mongoose show“TypeError:Cannot read property”CalculateObject Size“of undefined”?仅供参考,此功能现在可用。好吧,我不打算仅仅为了计数而将一个千兆字节的数据加载到RAM中。幸运的是,我实际上不需要这样做,我只是好奇地想知道哪个用户拥有最多的数据。我想,只需检查少数几个按对象数排名靠前的对象就很容易了。@MalcolmOcean是的,我同意,在MongoDB中使用JS是非常烦人的,但是缺少特性迫使我们在这种情况下这么做。。。对于docXarr
字段中的对象计数,您当然可以使用Why my mongoose show“TypeError:无法读取未定义”的属性“CalculateObject Size”?仅供参考,此功能现在可用