Получите среднее за год и ярлык? - PullRequest
1 голос
/ 18 апреля 2019

Я могу использовать этот запрос, чтобы получить среднее значение sqmPrice для myArea

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
}

1 Ответ

0 голосов
/ 18 апреля 2019

Вам нужно генерировать ключи динамически, поэтому вы должны использовать $ 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" } } }
])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...