获得每年的平均值和标签?

问题描述 投票:1回答:1

我可以使用此查询来获取myArea的平均sqmPrice

db.getCollection('sold').aggregate([
    {$match:{}},
    {$group: {_id: "$myArea", "sqmPrice": {$avg: "$sqmPrice"} }}
])

输出:

[
  {
      "_id" : "Yttre Aspudden",
      "sqmPrice" : 48845.7777777778
  },
  {
      "_id" : "Hägerstensåsen",
      "sqmPrice" : 120
  }
]

我想按年分组,理想情况下是一个看起来像这样的对象:

{
   "Yttre Aspudden": {
      2008: 1232,
      2009: 1244
      ...
   }
   ...
}

但格式化并不是最重要的。

这是一个示例对象,我想使用soldDate:

{
    "_id" : ObjectId("5beca41c78f21248ab47f4a6"),
    "location" : {
        "address" : {
            "streetAddress" : "Ljusstöparbacken 26C"
        },
        "position" : {
            "latitude" : 59.31427884,
            "longitude" : 18.00892421
        },
        "namedAreas" : [ 
            "Hägersten-Liljeholmen"
        ],
        "region" : {
            "municipalityName" : "Stockholm",
            "countyName" : "Stockholms län"
        },
        "distance" : {
            "ocean" : 3777
        }
    },
    "listPrice" : 1895000,
    "rent" : 1959,
    "floor" : 1,
    "livingArea" : 38.5,
    "source" : {
        "name" : "Fastighetsbyrån",
        "id" : 1573,
        "type" : "Broker",
        "url" : "http://www.fastighetsbyran.se/"
    },
    "rooms" : 1.5,
    "published" : ISODate("2018-11-02T20:55:19.000Z"),
    "constructionYear" : 1959,
    "objectType" : "Lägenhet",
    "booliId" : 3278478,
    "soldDate" : ISODate("2018-11-14T00:00:00.000Z"),
    "soldPrice" : 2620000,
    "soldPriceSource" : "bid",
    "url" : "https://www.booli.se/annons/3278478",
    "publishedDays" : 1735,
    "soldDays" : 1747,
    "daysUp" : 160,
    "street" : "Ljusstöparbacken",
    "streetYear" : "Ljusstöparbacken Hägersten-Liljeholmen 1959",
    "yearDay" : 318,
    "yearWeek" : 46,
    "roughSize" : 40,
    "sqmPrice" : 49221,
    "myArea" : "Gröndal",
    "hotlist" : true
}
mongodb aggregation-framework
1个回答
0
投票

您需要动态生成密钥,因此必须使用$arrayToObject。要构建聚合数据的对象,您需要三个$group阶段,并创建文档的新根,您可以使用$replaceRoot,尝试:

db.sold.aggregate([
    { $group: {_id: { area: "$myArea", year: { $year: "$soldDate" } }, "sqmPrice": {$avg: "$sqmPrice"} }},
    { $group: { _id: "$_id.area", avgs: { $push: { k: { $toString: "$_id.year" }, v: "$sqmPrice" } } } },
    { $group: { _id: null, areas: { $push: { k: "$_id", v: { $arrayToObject: "$avgs" } } } } },
    { $replaceRoot: { newRoot: { $arrayToObject: "$areas" } } }
])
© www.soinside.com 2019 - 2024. All rights reserved.