mongodb $match 匹配出现的怪事

假如有这么一下一个集合,我想查询年级中存在
姓名为张三且年龄为20的同学

db.test_grade.aggregate([{
    $match:{
       "students.name":"张三",
       "students.age":20,
    }
}])

在上面的sql 里面,第一个学生满足姓名张三,第二个学生满足年龄20,按道理说不应该返回这个年级的,但事实上还是返回了,附上表数据

{
    "_id" : 1,
    "grade_name" : "1年级",
    "students" : [
        {
            "_id" : 1,
            "name" : "张三",
            "age" : 18,
            "deleted" : 0
        },
        {
            "_id" : 2,
            "name" : "李四",
            "age" : 20,
            "deleted" : 0
        }
    ]
}

引用chatgpt部分指引作答:
根据您提供的表数据和查询条件,我理解您想要查询年级中同时满足姓名为"张三"且年龄为20的学生。根据您的查询语句,似乎在 $match 阶段使用了不正确的条件。

要正确查询满足条件的学生,您需要使用 MongoDB 的 $elemMatch 运算符来匹配嵌套的数组字段。下面是修正后的查询语句:

db.test_grade.aggregate([
  {
    $match: {
      students: {
        $elemMatch: {
          name: "张三",
          age: 20
        }
      }
    }
  }
])

这样,查询将仅返回包含同时满足姓名为"张三"且年龄为20的学生的年级记录。在您提供的数据中,满足条件的学生是第二个学生,而第一个学生的年龄不符合要求,因此只会返回包含第二个学生的年级。

希望这可以帮助到您!

在套一层

环境:MongoDB shell version v4.4.5
数据源:

img

测试结果:没有任何输出,是期望的输出

img

你这么写满足一个就返回,在里面多套一次