Подсчет результатов агрегации MongoDB - PullRequest
0 голосов
/ 25 сентября 2018

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

К сожалению, база данных огромна, а дубликаты часто являются преднамеренными.Я хотел бы найти count ключей, которые имеют дубликаты, вместо того, чтобы печатать результат с тысячами строк вывода.Возможно ли это?

(Примечание: я выполняю все запросы через оболочку, поэтому предпочтение отдается решениям, которые не требуют внешних инструментов или большого количества кода, но я понимаю, что это не всегда возможно.)

Пример записей:

{ "_id" : 1, "type" : "example", "key" : "111111", "value" : "abc" }
{ "_id" : 2, "type" : "example", "key" : "222222", "value" : "def" }
{ "_id" : 3, "type" : "example", "key" : "222222", "value" : "ghi" }
{ "_id" : 4, "type" : "example", "key" : "333333", "value" : "jkl" }
{ "_id" : 5, "type" : "example", "key" : "333333", "value" : "mno" }
{ "_id" : 6, "type" : "example", "key" : "333333", "value" : "pqr" }
{ "_id" : 7, "type" : "example", "key" : "444444", "value" : "stu" }
{ "_id" : 8, "type" : "example", "key" : "444444", "value" : "vwx" }
{ "_id" : 9, "type" : "example", "key" : "444444", "value" : "yz1" }
{ "_id" : 10, "type" : "example", "key" : "444444", "value" : "234" }

Вот запрос, который я использовал, чтобы найти дубликаты на основе key:

db.collection.aggregate([
    {
        $match: {
            type: "example"
        }
    },
    {
        $group: {
            _id: "$key",
            count: {
                $sum: 1
            }
        }
    },
    {
        $match: {
            count: {
                $gt: 1
            }
        }
    }
])

, который дает мневывод:

{
  "_id": "222222",
  "count": 2
},
{
  "_id": "333333",
  "count": 3
},
{
  "_id": "444444",
  "count": 4
}

Результат, который я хочу получить вместо:

3

Ответы [ 2 ]

0 голосов
/ 26 сентября 2018

Ответ Акриона кажется правильным, но я не могу проверить его, потому что мы находимся на более старой версии MongoDB.Коллега дал мне альтернативное решение, которое работает на 3.2 (не уверен в других версиях).

Добавление .toArray() преобразует результаты в массив, и вы можете получить размер массива, используя .length.

db.collection.aggregate([
    {
        $match: {
            type: "example"
        }
    },
    {
        $group: {
            _id: "$key",
            count: {
                $sum: 1
            }
        }
    },
    {
        $match: {
            count: {
                $gt: 1
            }
        }
    }
]).toArray().length
0 голосов
/ 25 сентября 2018

Вы почти там, просто пропустили последние $count:

db.collection.aggregate([
  {
    $match: {
      type: "example"
    }
  },
  {
    $group: {
      _id: "$key",
      count: {
        $sum: 1
      }
    }
  },
  {
    $match: {
      count: {
        $gt: 1
      }
    }
  },
  {
    $count: "count"
  }
])
...