J'essaie d'obtenir le nombre de mots clés avec parentId
, categioryId
et llcId
. Mon db est
{
"_id" : ObjectId("5673f5b1e4b0822f6f0a5b89"),
"keyword" : "electronic content management system",
"llcId" : "CL1K9B",
"categoryId" : "CL1K8V",
"parentId" : "CL1K8V",
}
J'ai essayé $project
avec $group
db.keyword.aggregate([
{
$group: {
_id: "$llcId",
total: {$sum: 1},
}
},
{
$project: {
categoryId: 1, total: 1
}
}
])
Et ça me donne un résultat comme
{ "_id" : "CL1KJQ", "total" : 17 }
{ "_id" : "CL1KKW", "total" : 30 }
Mais j'ai également besoin de données réelles, par exemple llcId
, categoryId
, keyword
, total
. J'ai essayé d'afficher cetgoryId
et le mot clé en utilisant $project
mais il n'affiche que _id
et total. Qu'est-ce qui me manque?
Pour obtenir le nombre keyword
, vous devez regrouper les documents par le champ keyword
, puis utiliser l'opérateur accumulateur $sum
pour obtenir le nombre de documents. En ce qui concerne les autres valeurs de champ, puisque vous regroupez tous les documents par valeur de mot-clé, le mieux que vous puissiez faire pour obtenir les autres champs est d'utiliser le $first
opérateur qui renvoie une valeur du premier document pour chaque groupe. Sinon, vous devrez peut-être utiliser le $Push
opérateur pour renvoyer un tableau des valeurs de champ pour chaque groupe:
var pipeline = [
{
"$group": {
"_id": "$keyword",
"total": { "$sum": 1 },
"llcId": { "$first": "$llcId"},
"categoryId": { "$first": "$categoryId"},
"parentId": { "$first": "$parentId"}
}
}
];
db.keyword.aggregate(pipeline)
Vous regroupez par llcId
donc cela donnera plus d'un categoryId
par llcId
. Si vous voulez categoryId
comme dans votre résultat, vous devez l'écrire dans votre requête de groupe. Par exemple:
db.keyword.aggregate([
{
$group: {
_id: "$llcId",
total: {$sum: 1},
categoryId:{$max:"$categoryId"}
}
},
{
$project: {
categoryId: 1, total: 1
}
}])