我有一个这个架构的集合:
{
"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),然后评估这些数组的平均值。我是对的吗?
我怎么能这样做?