【问题标题】:mongodb aggregation pipeline, fold an array property in `$project`ionmongodb聚合管道,在`$project`ion中折叠一个数组属性
【发布时间】:2014-07-14 18:04:51
【问题描述】:

给定一组文档,每个文档都有一个数组属性ks

{
  _id: ObjectId('...'),
  ks: [4, 3, 2, 1, 3], 
  v: 45
},
{
  _id: ObjectId('...'),
  ks: [3, 3, 5], 
  v: 21
},
{
  _id: ObjectId('...'),
  ks: [1, 5, 2, 8, 9, 7],
  v: 12
}

如何使用key = min ks 或其他折叠函数将此集合聚合到列表中?

[
    {
        _id: 1,
        v: 28.5 // = mean [45, 12]
    },
    {
        _id: 3,
        v: 21 // = mean [21]
    }
]

使用keyf function 进行分组工作

keyf: function(d) { d.ks.reduce(function(acc, a) { return acc<a ? acc : a; }) }

但是有没有办法通过聚合管道做到这一点?

【问题讨论】:

    标签: mongodb mapreduce mongodb-query aggregation-framework


    【解决方案1】:

    您似乎希望聚合键的最小$minks 和每个min ks 的“v”$avg。你需要先$unwind"ks"。

    您还需要对您的数据进行两次$group,一次用于查找ksmin,下一次用于计算vavg

    db.collection.aggregate([
        // Unwind the array
        { "$unwind": "$ks" },
    
        // Find the minimal key per document
        { "$group": {
             "_id": "$_id",
             "ks": { "$min": "$ks" },
             "v": { "$first": "$v" }
        }},
    
        // Group with the average value
        { "$group": {
            "_id": "$ks",
            "v": { "$avg": "$v" }
        }},
    
        // Group does not sort results
        { "$sort": { "_id": 1 } }
    ])
    

    结果:

    [ 
        { 
            "_id" : 1, 
            "v" : 28.5 
        }, 
        {
            "_id" : 3, 
            "v" : 21 
        } 
    ]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-12-17
      • 2020-12-12
      • 2016-05-03
      • 2020-11-17
      • 1970-01-01
      • 2021-02-09
      相关资源
      最近更新 更多