在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功能