【问题标题】:MongoDB Aggregate on huge documentsMongoDB 聚合大型文档
【发布时间】:2017-03-18 08:48:30
【问题描述】:

我正在尝试使用大型 mongoDB 自学 mongoDb(每个文档大约 10Mb,总共 1000 个文档)

我想尝试一些基础知识。例如,列出所有用户完成的每个活动,按 UsedCallories 对其进行排序。

db.getCollection('users').aggregate([
  {$group: {_id:"$Activities"}}, 
  {$sort: { UsedCallories: -1}}
],{allowDiskUse:true});

不幸的是,当我执行此脚本时,它给了我:'脚本已成功执行,但没有结果可显示。'?

你能指出我错在哪里吗?

缩短的示例文件:

{
  "Id": 1,
  "FirstName": "Casie",
  "LastName": "Crapo",
  "Email": "Casie.Crapo@databanken.db",
  "Weight": 92,
  "Length": 198,
  "Activities": [
    {
      "ActivityType": {
        "Name": "Sexual Activity",
        "CallPerSecond": 0.033333333
      },
      "StartCoordinates": {
        "Lattidude": -10.81907,
        "Longitude": -16.16832
      },
      "EndCoordinates": {
        "Lattidude": -10.81907,
        "Longitude": -16.16832
      },
      "StartDateTime": { $date: "2016-11-01T23:39:15Z" },
      "EndDateTime": { $date: "2016-11-02T02:38:45Z" },
      "UsedCallories": 772.63042705630426,
      "Measurements": [
        {
          "Heartrate": 142,
          "UnderPressure": 123,
          "Overressure": 156,
          "Speed": 0,
          "Coordinates": {
            "Lattidude": -10.81907,
            "Longitude": -16.16832
          }
        }
      ]
    }
  ]
}

更新“预期输出”:

因此,预期的输出只是用户的所有数组字段中所有活动的列表。按 UsedCallories 排序。

"Activities": [
    {
      "ActivityType": {
        "Name": "Sexual Activity",
        "CallPerSecond": 0.033333333
      },
      "StartCoordinates": {
        "Lattidude": -10.81907,
        "Longitude": -16.16832
      },
      "EndCoordinates": {
        "Lattidude": -10.81907,
        "Longitude": -16.16832
      },
      "StartDateTime": { $date: "2016-11-01T23:39:15Z" },
      "EndDateTime": { $date: "2016-11-02T02:38:45Z" },
      "UsedCallories": 772.63042705630426,
      "Measurements": [
        ...
      ]
    },{
      "ActivityType": {
        "Name": "Sexual Activity",
        "CallPerSecond": 0.033333333
      },
      "StartCoordinates": {
        "Lattidude": -10.81907,
        "Longitude": -16.16832
      },
      "EndCoordinates": {
        "Lattidude": -10.81907,
        "Longitude": -16.16832
      },
      "StartDateTime": { $date: "2016-11-01T23:39:15Z" },
      "EndDateTime": { $date: "2016-11-02T02:38:45Z" },
      "UsedCallories": 52.63042705630426,
      "Measurements": [
        ...
      ]
    },{
      "ActivityType": {
        "Name": "Sexual Activity",
        "CallPerSecond": 0.033333333
      },
      "StartCoordinates": {
        "Lattidude": -10.81907,
        "Longitude": -16.16832
      },
      "EndCoordinates": {
        "Lattidude": -10.81907,
        "Longitude": -16.16832
      },
      "StartDateTime": { $date: "2016-11-01T23:39:15Z" },
      "EndDateTime": { $date: "2016-11-02T02:38:45Z" },
      "UsedCallories": 20.22442,
      "Measurements": [
        ...
      ]
    }
  ]

重复问题后更新

好的,感谢您对重复帖子的引用。不过,这不是同一个问题。

我设法使用其中的一些来实际获得一些结果。 查询更改为:

db.getCollection('users').aggregate([
    {$unwind: '$Activities'}, 
    {$sort: {'Activities.UsedCallories': -1}}, 
    {$group: {_id: '$_id', 'Activities': {$push: '$Activities'}}}
    ], {
  allowDiskUse:true
 })

Wich 现在返回按用户分组的所有活动,我希望只列出所有这些未按用户分组的活动的列表

【问题讨论】:

  • 在分组前尝试管道中的 {$unwind: "$Activities"} 步骤。
  • @Veeram 我试过了,它仍然给出了同样的信息。 db.getCollection('users').aggregate([ {$unwind: "$Activities"}, {$group: {_id: "$Activities"}}, { $sort : { UsedCallories : -1 } }], { allowDiskUse:true })
  • @chridam 这是骗子吗?看起来用户不想按任何 ID 对其进行分组。他只需要将所有活动提取到结果集中并进行排序。
  • @Veeram 在 OP 更新他们的问题以反映对“欺骗”所做的更改后,我已经撤回了。底线是他们可以使用 fianl $project 管道仅返回活动列表或另一个 _id 值为 null$group 阶段将所有子文档分组为一个整体。
  • @Kieken72 我将作为评论添加。 db.getCollection('users').aggregate([ {$unwind: "$Activities"}, {$sort: { 'Activities.UsedCallories': -1}}, {$group: {_id : null, 活动: { $push: "$Activities" }}}, {$project:{_id:0,Activities:1}} ],{allowDiskUse:true});

标签: mongodb aggregation-framework robo3t


【解决方案1】:

感谢@chridam。添加我的评论作为答案。

db.getCollection('users').aggregate([{
    $unwind: "$Activities"
}, {
    $sort: {
        "Activities.UsedCallories": -1
    }
}, {
    $group: {
        _id: null,
        Activities: {
            $push: "$Activities"
        }
    }
}, {
    $project: {
        _id: 0,
        Activities: 1
    }
}], {
    allowDiskUse: true
});

【讨论】:

  • 谢谢,虽然我遇到了“BufBuilder 尝试将增长()到 134217728 字节,超过 64MB 限制”的问题,但它正在工作。但这将是另一个问题。我暂时将查询限制为 100 条记录!
猜你喜欢
  • 2020-10-10
  • 1970-01-01
  • 1970-01-01
  • 2015-07-05
  • 2013-09-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-02-16
相关资源
最近更新 更多