Requête d'agrégation dans Mongodb retourne domaine spécifique
Document De L'Échantillon:
{
"_id" : ObjectId("53329dfgg43771e49538b4567"),
"u" : {
"_id" : ObjectId("532a435gs4c771edb168c1bd7"),
"n" : "Salman khan",
"e" : "[email protected]"
},
"ps" : 0,
"os" : 1,
"rs" : 0,
"cd" : 1395685800,
"ud" : 0
}
Requête:
db.collectiontmp.aggregate([
{$match: {os:1}},
{$project : { name:{$toUpper:"$u.e"} , _id:0 } },
{$group: { _id: "$u._id",total: {$sum:1} }},
{$sort: {total: -1}}, { $limit: 10 }
]);
J'ai besoin des choses suivantes à partir de la requête ci-dessus:
- Groupe par
u._id
- Retourne le nombre total de documents et de courrier électronique à partir de l'enregistrement, comme indiqué ci-dessous:
{
"result":
[
{
"email": "",
"total": ""
},
{
"email": "",
"total": ""
}
],
"ok":
1
}
OriginalL'auteur Anubhav | 2014-08-21
Vous devez vous connecter pour publier un commentaire.
La première chose que vous faites mal ici n'est pas de comprendre comment
$
est conçue pour fonctionner. Les étapes du Pipeline comme$
et$group
n'affichera que les champs qui sont "explicitement". Donc uniquement les champs que vous dites à la production sera disponible à la suite des étapes du pipeline.Plus précisément ici, vous "projet" une partie seulement de la "u" champ dans votre document et vous avez donc supprimé les autres données disponibles. Le seul champ du présent, ici et maintenant est "nom", qui est celui que vous "projetée".
Peut-être qu'il était vraiment votre intention de faire quelque chose comme ceci:
Ou encore:
Qui vous donne le genre de sortie que vous recherchez.
Rappelez-vous que ceci est un "pipeline", alors que la "sortie" d'un stade antérieur est disponible à la prochaine étape. Il n'y a pas de "global" concept de document que ce n'est pas une déclaration comme en SQL, mais un "pipeline".
Alors, pensez Unix pipe "|" commande, ou au contraire de le chercher. Alors votre pensée va tomber en place.
Involontairement omis par moi dans le cadre d'expliquer comment les champs sont omis si non spécifié.
$match
devrait toujours être votre première étape, car c'est là un indice peut être utilisé. Également ajouter à des stades ultérieurs de filtrage supplémentaire si nécessaire.OriginalL'auteur Neil Lunn