我有以下文件:
{
"name":"St Peterburg",
"checkInAt" : ISODate(...),
"areas": [
{"length":2.0; "width":3.0},
{"length":4.0; "width":3.0},
{"length":2.0; "width":1.0}
]
}
我需要一个查询,它将按天分组这些文档,并为每个组计算一个小数,它等于组中所有区域数组中所有(长度*宽度)的平均值。所以,如果在一个组中我有两个文件:
A { areas:[{"length":2; "width":3}; {"length":3; "width":4};],
B { areas:[{"length":4; "width":5}; {"length":5; "width":6};]
我需要计算X = avg(2*3;3*4;4*5;5*6)
;
到目前为止,我的查询看起来像是:
db.getCollection('areas').aggregate([
{
"$group": {
"_id": {
"$dateToString": {
"format": "%Y-%m-%d",
"date": "$checkInAt"
}
},
"avgArea": {$avg: {"$multiply":["$$areas.length","$$areas.width"]}}
}
}
])
但这不起作用,
我真的很感激如何让它发挥作用
答案 0 :(得分:1)
这应该让你前进:
sri.txt
答案 1 :(得分:1)
您可以尝试以下聚合。
db.getCollection('areas').aggregate(
[{"$unwind":"$areas"},
{"$group":{
"_id":{
"$dateToString":{"format":"%Y-%m-%d","date":"$checkInAt"}
},
"avgArea":{
"$avg":{"$multiply":["$areas.length","$areas.width"]}
}
}}])
您还可以计算没有$unwind
的平均值。计算所有数组的$sum
,首先计算每个数组的$sum
,然后计算每个数组的所有数组。
将数组的计数保存在单独的字段中。
$project
通过将总和除以计数来平均。
db.getCollection('areas').aggregate(
[{"$group":{
"_id":{
"$dateToString":{"format":"%Y-%m-%d","date":"$checkInAt"}
},
"sumArea":{
"$sum":{
"$sum":{
"$map":{
"input":"$areas",
"as":"val",
"in":{"$multiply":["$$val.length","$$val.width"]}
}
}
}
},
"countArea":{"$sum":{"$size":"$areas"}}
}},
{"$project":{
"avgArea":{"$divide":["$sumArea","$countArea"]}
}}])