Нужен запрос Монго, чтобы получить счетчик нескольких полей в документах от mongodb - PullRequest
0 голосов
/ 27 сентября 2019

У меня есть документы на монго, как показано ниже:

{
    "a": "test",
    "b": "test", 
    "c": "test", 
    "d": "test", 
}

{
    "a": "test",
    "b": "test", 
    "d": "test", 
}

{
    "a": "notest",
    "b": "test", 
    "c": "test", 
    "d": "test", 
}

Я хочу получить все документы, где a="test"

Тогда результат должен быть похож на (Общее количество и общее количествокаждое поле)

{
    "totalcount" : 3,
    "b-count" : 2,
    "c-count" : 1,
    "d-count" : 1
}

1 Ответ

1 голос
/ 27 сентября 2019

Вам придется объединить (альтернатива - вызвать 3 разных запроса поиска и объединить результаты), это должно быть примерно так:

db.getCollection("").aggregate(
    [
        {
            "$match": {
               a: "test"
            }
        },
        { 
            "$project" : {
                "_id" : 0.0, 
                "b" : 1.0, 
                "c" : 1.0, 
                "d" : 1.0
            }
        }, 
        { 
            "$addFields" : {
                "tmp" : {
                    "$objectToArray" : "$$ROOT"
                }
            }
        }, 
        { 
            "$unwind" : "$tmp"
        }, 
        { 
            "$group" : {
                "_id" : "$tmp.k", 
                "count" : {
                    "$sum" : 1.0
                }
            }
        }, 
        { 
            "$group" : {
                "_id" : null, 
                "results" : {
                    "$push" : {
                        "label" : "$_id", 
                        "count" : "$count"
                    }
                }, 
                "total" : {
                    "$sum" : "$count"
                }
            }
        }
    ])

Результаты не совсем в форматекоторый вы просили, но это можно легко изменить, используя $ cond и $ addFields, однако я чувствую, что это излишне.

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