агрегация моноблока по ключам - PullRequest
0 голосов
/ 21 марта 2019

Я бегу к стене, пытаюсь собрать и суммировать некоторые документы.

с такими документами, как:

Doc1

{
  "_id": ObjectId("5c936353a27248985d4a23a8"),
  "aid": "XXX",
  "day": NumberLong(1553126400),
  "channels": {
    "desktop": {
      "page1": {
        "hits": 2
      },
      "page2": {
        "hits": 2
      }
    },
    "mobile": {
      "page1": {
        "hits": 4
      }
      "page2": {
        "hits": 4
      }
    }
  }
}

Doc2

{
  "_id": ObjectId("5c936353a27248985d4a23a7"),
  "aid": "XXX",
  "day": NumberLong(1553116400),
  "channels": {
    "desktop": {
      "page1": {
        "hits": 4
      },
      "page2": {
        "hits": 6
      }
    },
    "mobile": {
      "page1": {
        "hits": 8
      }
      "page2": {
        "hits": 8
      }
    }
  }
}

я хочу запустить конвейер, чтобы $ суммировать все "хиты" для конкретной страницы и семейства

то, что я хочу получить в результате, выглядит так:

{
  "_id": "XX",
  "channels": {
    "desktop": {
       "page1": {
          "hits": 6
       },
       "page2": {
          "hits": 8
       }
     },
    "mobile": {
       "page1": {
             "hits": 12
            },
       "page2": {
             "hits": 12
             }
     }
  }
}

Я не могу найти образцы того, как сделать $sum в случае, подобном этому.

1 Ответ

0 голосов
/ 21 марта 2019

я придумал:

[
    {
        "$match": {
            "aid": "5c90b9c936636572bb83fe93",
            "day": 
                { 
                    "$gte": 1550575794, 
                    "$lte": 1553126400 
                }
        }
    },
    {
        $project:
            {
                "o":
                    {
                    $objectToArray: "$channels"
                 }
            }
    },
    {
        $unwind: "$o"
    },
    {
        $project: {
         "family": "$o.k",
         "p": {
            $objectToArray: "$o.v"
            }
        }
    },
    {
        $unwind: "$p"
    }
    ,
    {
        $group: {
            "_id": {"path": "$p.k", family: "$family"},
            "sum": {$sum: "$p.v.hits"}

        }
    }



]

в результате документы, такие как:

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...