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”?仅供参考,此功能现在可用