Получить количество записей с полем, существующим в MongoDB - PullRequest
3 голосов
/ 05 августа 2020

У меня есть коллекция MongoDB с записями в следующем формате:

[
  { "item1": { "a": 1 }, "item2": { "a": 2 } },
  { "item1": { "a": 3 }, "item3": { "a": 4 } },
  { "item1": { "a": 5 }, "item2": { "a": 6 } },
]

Я хочу получить количество записей, имеющих поля item1, item2 и item3 (они не Не обязательно быть динамическим c. У меня есть только конечный набор элементов). Мне нужно количество записей с полем, существующим следующим образом:

{ "item1": 3, "item2": 2, "item3": 1 }

Чтобы получить количество item1, я делаю следующее:

db.collection.find({ "item1": { $exists: true }}).count()

Есть ли простой способ агрегировать количество всех трех элементов в одном запросе?

1 Ответ

3 голосов
/ 05 августа 2020

Вы можете использовать $ objectToArray и $ arrayToObject для динамического подсчета ваших ключей:

db.collection.aggregate([
    {
        $project: { root: { $objectToArray: "$$ROOT" } }
    },
    {
        $unwind: "$root"
    },
    {
        $group: { _id: "$root.k", total: { $sum: 1 } }
    },
    {
        $group: { _id: null, obj: { $push: { k: "$_id", v: "$total" } } }
    },
    {
        $replaceRoot: { newRoot: { $arrayToObject: "$obj" } }
    },
    {
        $project: { _id: 0 }
    }
])

Mon go Playground

...