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
}
}])