Mongodb Groupby на словарь внутри словаря - PullRequest
0 голосов
/ 09 декабря 2018

У меня есть коллекция, в которой есть документы, такие как: Документ 1:

{
 "company": "ABC"
 "application": {
    "app-1": {"earning_from_src_A": 50,
              "earning_from_src_B": 43},
    "app-2": {"earning_from_src_A": 10,
              "earning_from_src_B": 13}
 }
}    

Документ 2:

{
 "company": "ABCD"
 "application": {
    "app-1": {"earning_from_src_A": 150,
              "earning_from_src_B": 413},
    "app-2": {"earning_from_src_A": 110,
              "earning_from_src_B": 113},
    "app-3": {"earning_from_src_A": 1,
              "earning_from_src_B": 34},
 }
} 

Я хотел бы получить сумму заявок по всем документам коллекции,Как: Результаты:

{
 "app-1": {"earning_from_src_A": 200,
           "earning_from_src_B": 456},
 "app-2": {"earning_from_src_A": 120,
           "earning_from_src_B": 126},
 "app-3": {"earning_from_src_A": 1,
           "earning_from_src_B": 34},
}

Кто-нибудь, пожалуйста, помогите мне в этом .?

Я пытался использовать функцию агрегирования, но я не могу группировать по всей коллекции.

1 Ответ

0 голосов
/ 09 декабря 2018

Вы можете использовать ниже агрегации

Так что в основном ваши ключи здесь неизвестны.Поэтому их необходимо преобразовать в пару ключ-значение, используя агрегацию $objectToArray.Тогда вы можете легко $group их, используя имя приложения и считая там заработок от A и B.

db.collection.aggregate([
  { "$addFields": {
    "application": { "$objectToArray": "$application" }
  }},
  { "$unwind": "$application" },
  { "$group": {
    "_id": "$application.k",
    "earning_from_src_A": {
      "$sum": "$application.v.earning_from_src_A"
    },
    "earning_from_src_B": {
      "$sum": "$application.v.earning_from_src_B"
    }
  }},
  { "$group": {
    "_id": null,
    "data": {
      "$push": {
        "k": "$_id",
        "v": {
          "earning_from_src_A": "$earning_from_src_A",
          "earning_from_src_B": "$earning_from_src_B"
        }
      }
    }
  }},
  { "$replaceRoot": { "newRoot": { "$arrayToObject": "$data" }}}
])

Какие выводит

[
  {
    "app-1": {
      "earning_from_src_A": 200,
      "earning_from_src_B": 456
    },
    "app-2": {
      "earning_from_src_A": 120,
      "earning_from_src_B": 126
    },
    "app-3": {
      "earning_from_src_A": 1,
      "earning_from_src_B": 34
    }
  }
]
...