【问题标题】:Aggregation using Project and Slice, mongodb使用 Project 和 Slice 进行聚合,mongodb
【发布时间】: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


【解决方案1】:

如果你可以使用其他聚合算子进行更多的投影,你可以试试这个。

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

【讨论】:

  • 感谢 Hydro,我只使用了您的代码的顶部,而不是第二个投影,它完美地工作。感谢大家的帮助
  • 第一个投影将给出“Kim 的所有购买点数”的结果,第二个投影将给出“Kim 的最后一个购买点数”的结果。
猜你喜欢
  • 1970-01-01
  • 2013-03-10
  • 1970-01-01
  • 2012-10-24
  • 2021-04-11
  • 1970-01-01
  • 2015-12-03
  • 2018-05-09
  • 2022-12-12
相关资源
最近更新 更多