yewanji 2023-06-08 15:23 采纳率: 34.2%
浏览 27
已结题

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

  • 写回答

4条回答 默认 最新

  • CF2301_77400554X 2023-06-08 15:27
    关注

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

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

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

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

    希望这可以帮助到您!

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(3条)

报告相同问题?

问题事件

  • 系统已结题 6月21日
  • 已采纳回答 6月13日
  • 创建了问题 6月8日