2017-10-16 13 views
0

J'ai vu des questions similaires mais loin de complexes pour un débutant comme moi. De plus, aucune des réponses n'a offert de syntaxe.Agrégation utilisant Project et Slice, mongodb

Ma base de données:

name :"Kim" 
    points: [ 
     { category:"Purchase", 
     points: -50}, 
     { category: "Wage", 
     points : 275}, 
     { category: "Purchase", 
     points: -40} 
    ] 

    name :"Meghan" 
    points: [ 
     { category:"Contest", 
     points: 130}, 
     { category: "Purchase", 
     points : -25}, 
     { category: "Games", 
     points : 50} 
    ] 
    ] 

Ainsi dans le shell mongo je suis en train de le faire trouver tous les points.category qui équivaut à « Achat », mais seulement me revenir au dernier. J'ai essayé d'y parvenir en utilisant aggregate, $ project et $ tranche. Mon problème est que je ne comprends pas assez la syntaxe pour savoir si $ slice va dans $ project ou à l'extérieur séparé par une virgule. Je comprends la syntaxe quand j'utilise $ project par lui-même ou $ tranche par lui-même mais je n'ai aucune idée de comment utiliser toutes ces choses ensemble pour quelque chose de magique. Si quelqu'un pouvait m'aider à résoudre mon problème et à expliquer comment combiner correctement toutes ces choses, je serais toujours redevable. J'ai lu les docs mais rien ne m'a montré comment utiliser tout à la fois.

Je veux rechercher l'étudiant dont le nom est Kim points pour trouver le dernier achat qu'elle a fait. Le résultat que je veux est [{points: -40}]

+0

La partie que vous manque, vous devez [ 'filter' $] (https://docs.mongodb.com/manual/reference/operator/aggregation/filter/) le contenu du tableau pour' "Achat "' first ** before ** vous appliquez '$ slice' ou même [' $ arrayElemAt'] (https://docs.mongodb.com/manual/reference/operator/aggregation/arrayElemAt/) pour obtenir le * * dernier ** élément. Donc '$ filter' retourne le tableau avec juste ces éléments. Envelopper cette instruction avec '$ slice' et' -1' pour l'index retourne le "dernier" de ce tableau "filtré". –

+0

Voir [Récupérer uniquement l'élément interrogé dans un tableau d'objets de la collection MongoDB] (https://stackoverflow.com/q/3985214/2313887), par exemple l'utilisation de '$ filter' en plus de la documentation liée. –

+0

Ok, j'ai trouvé ceci: 'db.students.agrgregate ([{$ project: {points: {$ filter: {entrée:" $ points ", comme:" pts ", cond: {$ eq: [" $ $ pts.category "," Purchase "]}}}}}]). pretty()' Le problème est qu'il renvoie les achats de chaque étudiant. Comment puis-je faire revenir juste kims et où puis-je mettre la tranche pour obtenir seulement le dernier achat. –

Répondre

0

Si vous pouvez utiliser plus de projection avec un autre opérateur d'agrégation, vous pouvez essayer ceci.

db.students.aggregate([ 
{ $match : { name : "Kim" } }, 
{ $project: 
    { 
     points: { 
      $filter : { input: "$points", as:"pts", cond: {$eq: ["$$pts.category", "Purchase"]} } 
      } 
    } 
}, 
{ $project: 
    { 
     _id : 0, 
     points: { $arrayElemAt: [{$slice: [ "$points.points", -1]},0] } 
    } 
} 
]) 
+0

Merci Hydro, j'ai seulement utilisé la partie supérieure de votre code, pas la deuxième projection et cela a fonctionné parfaitement. Merci à tous pour toute l'aide –

+0

La première projection donnera un résultat de "tous les points d'achat de Kim", la deuxième projection donnera un résultat de "les derniers points d'achat de Kim". –