mongo查询内嵌文档

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

Sql代码   收藏代码
  1. > db.teacher.find ()  
  2. {  
  3. “_id” : ObjectId(“4e255ad2717ed94f4532ac08″),“subject”:”Chinese”  
  4. “students” : [  
  5. {  
  6. "name" : "tom",  
  7. "age" : "14",  
  8. "hobby" : "volleyball"  
  9. },  
  10. {  
  11. "name" : "Lucy",  
  12. "age" : "15",  
  13. "hobby" : "football"  
  14. }  
  15. ]}  
  16.   
  17. {  
  18. “_id” : ObjectId(“4e255ad2717ed94f4532ac09″),“subject”:”Chinese”  
  19. “students” : [  
  20. {  
  21. "name" : "Mary",  
  22. "age" : "18",  
  23. "hobby" : "volleyball"  
  24. },  
  25. {  
  26. "name" : "Jack",  
  27. "age" : "14",  
  28. "hobby" : "football"  
  29. }  
  30. ]}  



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

Sql代码   收藏代码
  1. db.teacher.find({"students":{"age":"15","hobby":"football"}})  



查询结果:无数据,因为内嵌文档如果使用这种直接方式查,必须要把students内容都包含进来,例:

Sql代码   收藏代码
  1. db.teacher.find({"students":{"name":"tom","age":"15","hobby":"football"}})  


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



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

Sql代码   收藏代码
  1. db.teacher.find({"students.age":"15","students.hobby":"football"})  


查询结果为:

Sql代码   收藏代码
  1. {  
  2. “_id” : ObjectId(“4e255ad2717ed94f4532ac08″),“subject”:”Chinese”  
  3. “students” : [  
  4. {  
  5. "name" : "tom",  
  6. "age" : "14",  
  7. "hobby" : "volleyball"  
  8. },  
  9. {  
  10. "name" : "Lucy",  
  11. "age" : "15",  
  12. "hobby" : "football"  
  13. }  
  14. ]}  
  15.   
  16. {  
  17. “_id” : ObjectId(“4e255ad2717ed94f4532ac09″),“subject”:”Chinese”  
  18. “students” : [  
  19. {  
  20. "name" : "Mary",  
  21. "age" : "18",  
  22. "hobby" : "volleyball"  
  23. },  
  24. {  
  25. "name" : "Jack",  
  26. "age" : "14",  
  27. "hobby" : "football"  
  28. }  
  29. ]}  



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


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


推荐
例 

Sql代码   收藏代码
  1. db.teacher.find("$elemMatch":{"students.age":"15","students.hobby":"football"})  



或者

Sql代码   收藏代码
  1. db.teacher.find({"students:"{"$elemMatch":{"age":"15","hobby":"football"}}})  



查询结果如下:

Sql代码   收藏代码
  1. {  
  2. “_id” : ObjectId(“4e255ad2717ed94f4532ac08″),“subject”:”Chinese”  
  3. “students” : [  
  4. {  
  5. "name" : "tom",  
  6. "age" : "14",  
  7. "hobby" : "volleyball"  
  8. },  
  9. {  
  10. "name" : "Lucy",  
  11. "age" : "15",  
  12. "hobby" : "football"  
  13. }  
  14. ]}  




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

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

2,使用了$elemMatch 实现组内查询,实现 and功能

猜你喜欢

转载自ddlgyq.iteye.com/blog/2064476