|
在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岁,或者学生爱好为足球的,都查出来了
解决方法:利用 $elemMatch 来实现组内查询
推荐
例
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"
}
]}
这样我们就实现了内嵌文档的查询,主要采取了两个策略:
1,内嵌文档查询直接用 students.age 和 students.hobby
2,使用了$elemMatch 实现组内查询,实现 and功能 |
|
|