mongodb 嵌套查询如何过滤掉不符合条件的数据

假如有一个年级集合。年级下面有很多学生

[
  {
    "_id": "1",
    "gradeName": "一年级",
    "students": [
      {
        "name": "张三",
        "age": "18"
      },
      {
        "name": "张三丰",
        "age": "88"
      },
      {
        "name": "李四"
      }
    ]
  },
  {
    "_id": "2",
    "gradeName": "二年级",
    "students": [
      {
        "name": "老王",
        "age": "18"
      },
      {
        "name": "老李",
        "age": "88"
      },
      {
        "name": "老张",
        "age": 28
      }
    ]
  }
]

我想查询姓张的同学的所有年级,且子集里面只包含姓张的同学
期待的返回结果如下

{
    "_id": "1",
    "gradeName": "一年级",
    "students": [
      {
        "name": "张三",
        "age": "18"
      },
      {
        "name": "张三丰",
        "age": "88"
      }
    ]
  }

方法一:使用$unwind将数组打散,获取结果集后用$match筛选符合条件的数据,最后使用$group进行聚合获取最终结果集。
方法二:使用$match过滤符合条件的根文档结果集,然后使用$project返回对应字段的同时,在数组中使用$filter进行内部过滤,返回最终结果集

这个文章很适合你:https://www.51sjk.com/b91b129138/

望采纳,望采纳!祝你的问题早日解决!!!!!

https://blog.csdn.net/bicheng4769/article/details/79579830

$elemMatch

望采纳!!!点击回答右侧采纳即可采纳!!!(java写的一个程序给你兄弟
代码:

List<Map<String, Object>> grades = new ArrayList<>();
// 假设上面的年级集合已经存在,且为grades

List<Map<String, Object>> result = new ArrayList<>();
for (Map<String, Object> grade : grades) {
  List<Map<String, Object>> students = (List<Map<String, Object>>) grade.get("students");
  List<Map<String, Object>> zhangStudents = students.stream()
      .filter(student -> student.get("name").toString().startsWith("张"))
      .collect(Collectors.toList());
  if (!zhangStudents.isEmpty()) {
    Map<String, Object> filteredGrade = new HashMap<>(grade);
    filteredGrade.put("students", zhangStudents);
    result.add(filteredGrade);
  }
}

System.out.println(result);


结果:


[  {    "_id": "1",    "gradeName": "一年级",    "students": [      {        "name": "张三",        "age": "18"      },      {        "name": "张三丰",        "age": "88"      }    ]
  }
]

db.grades.find({
    'students': {
        '$elemMatch': {
            'name': {
                '$regex': '^张'
            }
        }
    }
}, {
    '_id': 1,
    'gradeName': 1,
    'students': {
        '$elemMatch': {
            'name': {
                '$regex': '^张'
            }
        }
    }
})

仅供参考,望采纳,谢谢。

MongoDB 的嵌套查询是通过在查询语句中使用管道符来实现的。

例如,假设你有如下所示的一个集合:

{
  _id: 1,
  name: 'John',
  age: 20,
  address: {
    street: '123 Main Street',
    city: 'New York',
    state: 'NY'
  }
}
{
  _id: 2,
  name: 'Jane',
  age: 25,
  address: {
    street: '456 Maple Street',
    city: 'Chicago',
    state: 'IL'
  }
}
{
  _id: 3,
  name: 'Bob',
  age: 30,
  address: {
    street: '789 Pine Street',
    city: 'Los Angeles',
    state: 'CA'
  }
}

你可以使用管道符来过滤出 age 大于 25 岁的文档,如下所示:

db.collection.find({ age: { $gt: 25 } })

如果你想过滤出 address.state 等于 'NY' 的文档,可以这样写:

db.collection.find({ 'address.state': 'NY' })

如果你想结合这两种过滤条件,可以使用 $and 操作符,如下所示:

db.collection.find({ $and: [{ age: { $gt: 25 } }, { 'address.state': 'NY' }] })

希望这些信息能够帮助你!