mongo查询内嵌文档

本文详细阐述了在MongoDB中如何高效地进行内嵌文档查询,通过使用$elemMatch实现组内查询,解决了特定条件下的复杂匹配问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在mongo根据内嵌文档查询实例

> db.teacher.find ()
{
“_id” : ObjectId(“4e255ad2717ed94f4532ac08″),“subject”:”Chinese”
“students” : [
{
"name" : "tom",
"age" : "14",
"hobby" : "volleyball"
},
{
"name" : "Lucy",
"age" : "15",
"hobby" : "football"
}
]}

{
“_id” : ObjectId(“4e255ad2717ed94f4532ac09″),“subject”:”Chinese”
“students” : [
{
"name" : "Mary",
"age" : "18",
"hobby" : "volleyball"
},
{
"name" : "Jack",
"age" : "14",
"hobby" : "football"
}
]}


查询 这些老师的学生里age=15 并且hobby是football的 。
如果使用

db.teacher.find({"students":{"age":"15","hobby":"football"}})


查询结果:无数据,因为内嵌文档如果使用这种直接方式查,必须要把students内容都包含进来,例:
db.teacher.find({"students":{"name":"tom","age":"15","hobby":"football"}})

但是这样的结果根本不是我们预期的,我们要查询的是只要两个限定条件。


但是可以用一种方法来代替,就是

db.teacher.find({"students.age":"15","students.hobby":"football"})

查询结果为:

{
“_id” : ObjectId(“4e255ad2717ed94f4532ac08″),“subject”:”Chinese”
“students” : [
{
"name" : "tom",
"age" : "14",
"hobby" : "volleyball"
},
{
"name" : "Lucy",
"age" : "15",
"hobby" : "football"
}
]}

{
“_id” : ObjectId(“4e255ad2717ed94f4532ac09″),“subject”:”Chinese”
“students” : [
{
"name" : "Mary",
"age" : "18",
"hobby" : "volleyball"
},
{
"name" : "Jack",
"age" : "14",
"hobby" : "football"
}
]}


这也不是我们预期的,这其实是一种or操作,把所有学生年轻为15岁,或者学生爱好为足球的,都查出来了


[b]解决方法:利用 $elemMatch 来实现组内查询[/b]


[color=red]推荐[/color]

db.teacher.find("$elemMatch":{"students.age":"15","students.hobby":"football"})


或者
db.teacher.find({"students:"{"$elemMatch":{"age":"15","hobby":"football"}}})


查询结果如下:

{
“_id” : ObjectId(“4e255ad2717ed94f4532ac08″),“subject”:”Chinese”
“students” : [
{
"name" : "tom",
"age" : "14",
"hobby" : "volleyball"
},
{
"name" : "Lucy",
"age" : "15",
"hobby" : "football"
}
]}



[b]这样我们就实现了内嵌文档的查询,主要采取了两个策略:

1,内嵌文档查询直接用 students.age 和 students.hobby

2,使用了$elemMatch 实现组内查询,实现 and功能[/b]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值