如何在Mongo聚合中折叠数组?

时间:2013-09-20 20:16:25

标签: mongodb

我可以从Mongo聚合中获得嵌套数组的结果:

"vals": [
[ [ { "reference_date": "2013-09-01", "price": 79 },
    { "reference_date": "2013-09-02", "price": 69 },
    { "reference_date": "2013-09-03", "price": 101 }, ] ],
[ [ { "reference_date": "2013-08-01", "price": 101 },
    { "reference_date": "2013-08-02", "price": 106 },
    { "reference_date": "2013-08-03", "price": 101 }, ] ],
[ [ { "reference_date": "2013-07-01", "price": 129 },
    { "reference_date": "2013-07-02", "price": 163 },
    { "reference_date": "2013-07-03", "price": 192 }, ] ],

我正在使用此查询:

coll.aggregate([
{ $match:   { 'account_id': '123', }, },
{ $group: {
        _id: { 'account': '$account_id' },
        vals: { $push: '$data.prices' } }, },
]);

我的基础文档如下所示:

{'account_id': '123',
  . . .  other stuff . . . 
  'data': [{
       'prices': [ 
          { "reference_date": "2013-08-01", "price": 101 },
          { "reference_date": "2013-08-02", "price": 106 },
          { "reference_date": "2013-08-03", "price": 101 }, 
        ],
        . . . other stuff under data key . . . 
   }]

如何修改查询以便将嵌套数组组合成一个数组,只保留对象项?

已更新: 提供更完整的基础文档视图。对不起以前没有。

更新2 嗯,我是一个糟糕的问题提问者,我的<<数据>> subdoc失败b / c数据下的值不是对象,它是一个只包含一个对象的数组。我正在试图弄清楚那个物体的提取,这个答案会起作用。

1 个答案:

答案 0 :(得分:2)

更新以反映完整的文档详细信息

您需要在$unwind之前data data.prices$group数组:

db.coll.aggregate([
  { $unwind: '$data' },
  { $unwind: '$data.prices' },
  { $match: { 'account_id': '123' } },
  { $group: {
    _id: { 'account': '$account_id' },
    vals: { $push: '$data.prices' } } }
]);