Как подсчитать все возможные элементы вложенного документа для данного верхнего элемента в Mongo? - PullRequest
0 голосов
/ 11 сентября 2018

Не уверен, что здесь используется правильная терминология, но предположим, что в Mongo доступна следующая упрощенная структура JSON:

{
"_id": 1234,
"labels": {
    "label1": {
        "id": "l1",
        "value": "abc"
    },
    "label3": {
        "id": "l2",
        "value": "def"
    },
    "label5": {
        "id": "l3",
        "value": "ghi"
    },
    "label9": {
        "id": "l4",
        "value": "xyz"
    }
}
}

{
"_id": 5678,
"labels": {
    "label1": {
        "id": "l1",
        "value": "hjk"
    },
    "label5": {
        "id": "l5",
        "value": "def"
    },
    "label10": {
        "id": "l10",
        "value": "ghi"
    },
    "label24": {
        "id": "l24",
        "value": "xyz"
    }
}
}

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

Как я могу сгруппировать / посчитать существующие элементы (например, как если бы я использовал подстановочный знак), чтобы я мог получить некоторый отчетливый обзоркак

"label1":2
"label3":1
"label5":2
"label9":1 
"label10":1
"label24":1

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

На самом деле названия меток могут быть довольно дикими, я использовал labelx для удобства чтения в примере.

1 Ответ

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

Вы можете попробовать ниже агрегации в 3.4.

Используйте $objectToArray для преобразования объекта в массив пар значений ключа, за которыми следуют $unwind и $group на ключе для подсчета вхождений.

db.col.aggregate([
  {"$project":{"labels":{"$objectToArray":"$labels"}}},
  {"$unwind":"$labels"},
  {"$group":{"_id":"$labels.k","count":{"$sum":1}}}
])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...