MongoDB - 文档上的平均字段值

时间:2017-10-02 07:38:34

标签: mongodb mongodb-query aggregation-framework

我有一个这个架构的集合:

{
    "fields":
        {
            "field1": [
                {"name": "abc", "value": 2},
                {"name": "bcd", "value": 4},
                {"name": "cde", "value": 6}
            ],
            "field2": [
                {"name": "dec", "value": 3},
                {"name": "das", "value": 8},
                {"name": "pam", "value": 10}
            ]
        }
},
{
    "fields":
        {
            "field1": [
                {"name": "abc", "value": 7},
                {"name": "cde", "value": 12}
            ],
            "field2": [
                {"name": "dec", "value": 3},
                {"name": "das", "value": 8},
                {"name": "pam", "value": 10}
            ]
        }
}

我想要获得的是例如' field1'的所有成员的平均值,如果成员存在于文档中而不存在于另一个成员中,则评估0(如' bcd')。

所以在这个例子中我应该得到:

{
    '_id': 'abc',
    'avg': 4.5
},
{
    '_id': 'bcd',
    'avg': 2
},
{
    '_id': 'cde',
    'avg': 9
}

我写了这个聚合查询,但我很确定它有问题:

db.statuses.aggregate([
    {
        $unwind: '$fields.field1'
    },
    {
        $group: { 
            _id: '$fields.field1.name', 
            avg: { 
                $avg: '$fields.field1.value'
            }
        }
    },
    {
        $sort: {
            avg: -1
        }
    }
])

我想我应该在平均计算之前添加一个步骤,我必须为每个名称构建一个所有值的数组(如果文档中不存在名称,则为0),然后评估这些数组的平均值。我是对的吗?

我怎么能这样做?

0 个答案:

没有答案