为表示数组

时间:2018-01-08 20:09:13

标签: mongodb mongodb-query aggregation-framework

我有以下文件:

{
"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"]}}
            }
        }
    ])

但这不起作用,

我真的很感激如何让它发挥作用

2 个答案:

答案 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"]}
}}])