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

3
我可以从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:我是一个糟糕的问题提问者,我的<>子文档失败了,因为data下的值不是对象,而是仅持有一个对象的数组。我正在尝试弄清楚如何提取该对象,这时答案将会起作用。

为了澄清:您的基础文档实际上有双重嵌套的数组吗?也就是说,您的示例都是由一个包含文档数组的数组组成的:[[obj1,obj2,obj3]],[[obj4,obj5,obj6]],... 您的数组是否实际上像这样双重包装,还是这只是一个打字错误? - 3rf
1个回答

2

更新:以反映全面的文档细节

在进行$group之前,您需要对datadata.prices数组进行$unwind操作:

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

谢谢查看。我提供了更多的文档,请让我知道如果您需要更多的信息。 - chernevik
第一个更新的唯一调整是在data.prices展开之前加上'{ $unwind: '$ data' }'。这是为了弥补数据键包含一个元素数组而不是对象的事实 - 我猜第一个展开将对象从该数组中提取出来。对于基本对象的文档质量不佳,我深表歉意,并感谢您的所有帮助。 - chernevik
@chernevik 好的,我已经更新了答案。很高兴最终它起作用了! - JohnnyHK

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接