使用Project和Slice聚合,mongodb

时间:2017-10-16 03:14:05

标签: mongodb aggregation-framework slice mongo-shell

我已经看过类似的问题,但对于像我这样的新手来说,这很复杂。此外,没有一个答案提供语法分解。

我的数据库:

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

所以在mongo shell中,我试图让它找到等于"购买"的每个points.category。但只回到我的最后一个。我试图通过使用aggregate,$ project和$ slice来实现这一点。我的问题是,我不能很好地理解语法,以便知道$ slice是否在$ project之内或者以逗号分隔。我理解当我单独使用$ project或单独使用$ slice时的语法,但我不知道如何将所有这些东西一起用于神奇的东西。如果有人可以帮助我解决我的问题并解释如何将所有这些事情恰当地结合在一起,那么我将永远感激不尽。我已经阅读了文档,但没有任何内容告诉我如何一次性使用所有内容。

我想搜索名为金点的学生,以查找她最后一次购买。我想要的结果是        [{点:-40}]

1 个答案:

答案 0 :(得分: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] }
    }
}
])