$ elemMatch匹配最后一个元素而不是第一个

时间:2019-01-07 04:30:15

标签: mongodb

例如,如果我有$elemMatch页面中的数据,我将尝试查找与条件匹配的数组的最后一个元素:

{
  _id: 1,
  students: [
    { name: "john", school: 102, age: 10 },
    { name: "jess", school: 102, age: 11 },
    { name: "jeff", school: 108, age: 15 }
  ]
}

我想找到其中有school: 102的最后一个元素,在这种情况下,我将得到{ name: "jess", school: 102, age: 11 }。 但是$elemMatch会返回john

我觉得应该有一种简单的方法,但是如果不使用$unwind和复杂的聚合,就找不到任何解决方案。

有什么想法吗?

1 个答案:

答案 0 :(得分:0)

您可以使用$filter仅让学校102的学生,然后使用-1$slice从过滤后的数组中获取最后一个元素。要使其尽可能短,可以使用$let定义临时变量,请尝试:

db.col.aggregate([
    {
        $addFields: {
            students: {
                $let: {
                    vars: { 
                        filtered: { $filter: { input: "$students", as: "s", cond: { $eq: [ "$$s.school", 102 ] } } } 
                    },
                    in: { $slice: [ "$$filtered", -1 ] }
                }
            }
        }
    }
])