2017-10-16 164 views
0

我见过类似的问题,但对于像我这样的新手来说,这很复杂。再加上没有答案提供了语法分解。聚合使用项目和切片,mongodb

我的数据库:

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

所以在蒙戈外壳我试图得到它找到每一个等于“购买”,但只返回给我的最后一个points.category。我试图通过使用聚合,$ project和$ slice来实现这一点。我的问题是,我不明白这个语法足以知道$ slice是在$ project内还是在外面用逗号分隔。我明白当我自己使用$ project或者使用$ slice时的语法,但是我不知道如何将所有这些东西一起使用到一些神奇的东西。如果有人能帮我解决我的问题,并解释如何将所有这些事情妥善地结合在一起,我会永远感激不尽。我已经阅读了文档,但没有告诉我如何一次使用所有内容。

我想搜索名字是Kim的学生点,找到她最后一次购买。我想要的结果是 [{points:-40}]

+0

你缺少的部分是你需要['$ filter'(https://docs.mongodb.com/manual/reference/operator/aggregation/filter/)数组内容'“购买“**之前**你申请'$切片'或甚至['arrayElemAt'](https://docs.mongodb.com/manual/reference/operator/aggregation/arrayElemAt/)为了得到* *最后**元素。所以'$ filter'只返回这些元素的数组。用'$ slice'和'-1'对该索引包装该索引以返回该“已过滤”数组中的“最后一个”。 –

+0

请参阅[仅检索MongoDB集合中对象数组中的查询元素](https://stackoverflow.com/q/3985214/2313887),以了解链接文档以外的'$ filter'的示例用法。 –

+0

好吧,我想出了这个:'db.students.aggregate([{$ project:{points:{$ filter:{input:“$ points”,as:“pts”,cond:{$ eq:[“$ $ pts.category“,”Purchase“]}}}}}])。pretty()'问题是它返回每个学生的购买。我如何让它只返回金钱,我在哪里放置切片只得到最后一次购买。 –

回答

0

如果您可以在其他聚合运算符上使用更多投影,则可以尝试此操作。

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

感谢Hydro,我只使用了代码的顶部,而不是第二个投影,它的工作完美无瑕。谢谢大家的全力帮助 –

+0

第一个投影会给出“Kim所有购买点数”的结果,第二个投影会给出“Kim最后一个购买点数”的结果。 –