Mongodb 3.2 (агрегация): группировка по нескольким значениям одного и того же атрибута - PullRequest
0 голосов
/ 09 января 2019

У меня есть следующие запросы на подсчет:

db.collection.count({code : {$in : ['delta', 'beta']}});
db.collection.count({code : 'alpha'});
для данного набора данных
[
    {
        "code": "detla",
        "name": "delta1"
    },
    {
        "code": "detla",
        "name": "delta2"
    },
    {
        "code": "detla",
        "name": "delta3"
    },
    {
        "code": "detla",
        "name": "delta4"
    },
    {
        "code": "beta",
        "name": "beta1"
    },
    {
        "code": "beta",
        "name": "beta2"
    },
    {
        "code": "beta",
        "name": "beta3"
    },
    {
        "code": "beta",
        "name": "beta4"
    },
    {
        "code": "beta",
        "name": "beta5"
    },
    {
        "code": "alpha",
        "name": "alpha1"
    },
    {
        "code": "alpha",
        "name": "alpha2"
    },
    {
        "code": "alpha",
        "name": "alpha3"
    }
]

Есть ли способ достичь этого, используя одиночное объединение () и вложенную группу $ в mongodb@3.2? Я понимаю, что это классический вариант использования для mapReduce () , но я не могу здесь указать, поскольку $ group по параметрам (code в приведенном выше примере) является динамически генерируемым атрибутом, поэтому Построение этапов агрегации также динамично.

Ожидаемый результат совпадает с результатом двух запросов на подсчет. -> Запрос первого счета (дельта, комбинированный счет бета) -> 9 -> Запрос второго счета (счет альфа) -> 3

1 Ответ

0 голосов
/ 09 января 2019

Вы можете использовать ниже $group aggregation

db.collection.aggregate([
  { "$group": {
    "_id": null,
    "first": {
      "$sum": {
        "$cond": [{ "$in": ["$code", ["detla", "beta"]] }, 1, 0]
      }
    },
    "second": {
      "$sum": {
        "$cond": [{ "$eq": ["alpha", "$code"] }, 1, 0]
      }
    }
  }}
])

Но я бы предпочел пойти с двумя запросами подсчета для лучшей производительности

$in также выпущен в версии 3.4 . Вы можете использовать $setIsSubset для предыдущих версий

db.collection.aggregate([
  { "$group": {
    "_id": null,
    "first": {
      "$sum": {
        "$cond": [{ "$setIsSubset": [["$code"], ["detla", "beta"]] }, 1, 0]
      }
    },
    "second": {
      "$sum": {
        "$cond": [{ "$eq": ["alpha", "$code"] }, 1, 0]
      }
    }
  }}
])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...