假如有一个年级集合。年级下面有很多学生
[
{
"_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' }] })
希望这些信息能够帮助你!