假如有这么一下一个集合,我想查询年级中存在
姓名为张三且年龄为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
数据源:
测试结果:没有任何输出,是期望的输出
你这么写满足一个就返回,在里面多套一次