Mongo $group с $project

Я пытаюсь получить количество ключевых слов с parentId, categioryId и llcId. Мой db

{
    "_id" : ObjectId("5673f5b1e4b0822f6f0a5b89"),
    "keyword" : "electronic content management system",
    "llcId" : "CL1K9B",
    "categoryId" : "CL1K8V",
    "parentId" : "CL1K8V",

}

Я пробовал $project с помощью $group

db.keyword.aggregate([
    {
        $group: {
            _id: "$llcId",
            total: {$sum: 1},
        }
    },
    {
        $project: {
            categoryId: 1, total: 1
        }
    }
])

И это дает мне результат вроде

{ "_id" : "CL1KJQ", "total" : 17 }
{ "_id" : "CL1KKW", "total" : 30 }

Но мне нужны фактические данные в результате, например, llcId, categoryId, keyword, total. Я попытался отобразить cetgoryId и ключевое слово, используя $project, но он отображает только _id и total. Что мне не хватает?

Ответ 1

Чтобы получить счетчик keyword, вам нужно сгруппировать документы в поле keyword, затем используйте оператор аккумулятора $sum, чтобы получить количество документов. Что касается других значений полей, поскольку вы группируете все документы по значению ключевого слова, лучше всего вы можете сделать, чтобы получить другие поля, используйте $first, который возвращает значение из первого документа для каждой группы. В противном случае вам может понадобиться оператор $push, чтобы вернуть массив значений полей для каждой группы:

var pipeline = [
    {
        "$group": {
            "_id": "$keyword",
            "total": { "$sum": 1 },
            "llcId": { "$first": "$llcId"},
            "categoryId": { "$first": "$categoryId"},
            "parentId": { "$first": "$parentId"}
        }
    }
];

db.keyword.aggregate(pipeline)

Ответ 2

Вы группируете llcId, чтобы он дал более одного categoryId за llcId. Если вы хотите categoryId как в вашем результате, вы должны написать это в своем групповом запросе. Например:

db.keyword.aggregate([
{
    $group: {
        _id: "$llcId",
        total: {$sum: 1},
        categoryId:{$max:"$categoryId"}
    }

},
{
    $project: {
        categoryId: 1, total: 1
    }
}])