【发布时间】:2018-03-27 12:12:50
【问题描述】:
我见过类似的问题,但对于像我这样的新手来说太复杂了。另外,没有一个答案提供语法分解。
我的数据库:
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 等于“Purchase”但只返回给我最后一个。我试图通过使用聚合、$project 和 $slice 来实现这一点。我的问题是我不太了解语法,无法知道 $slice 是在 $project 内部还是在外部以逗号分隔。当我单独使用 $project 或单独使用 $slice 时,我理解语法,但我不知道如何将所有这些东西一起使用来创造神奇的东西。如果有人可以帮助我解决我的问题并解释如何将所有这些东西正确地结合在一起,我将永远感激不尽。我已经阅读了文档,但没有任何内容告诉我如何一次使用所有内容。
我想搜索名为 Kim 的学生,以找到她最后一次购买。我想要的结果是 [{points:-40}]
【问题讨论】:
-
您缺少的部分是您需要先
$filter"Purchase"的数组内容在您应用$slice甚至$arrayElemAt以获得last 元素。所以$filter只返回包含这些元素的数组。用$slice和-1包装该语句作为索引返回该“过滤”数组中的“最后一个”。 -
请参阅Retrieve only the queried element in an object array in MongoDB collection,例如除了链接文档之外,
$filter的用法。 -
好吧,我想出了这个:` db.students.aggregate([ { $project: { points: { $filter : { input: "$points", as:"pts", cond: {$eq: ["$$pts.category", "Purchase"]}}}}}]).pretty()` 问题是它返回每个学生的购买。我如何让它只返回 kims 以及我将切片放在哪里才能获得最后一次购买。
标签: mongodb aggregation-framework slice mongo-shell