`

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

分享到:
评论

相关推荐

    高可用的MongoDB集群详解

    形式的标记,可轻易查询文档中内嵌的对象及数组。3.完整的索引支持:包括文档内嵌对象及数组。Mongo的查询优化器会分析查询表达式,并生成一个高效的查询计划。4.查询监视:Mongo包含一个监控工具用于分析数据库操作性能...

    mongodb 数据类型(null/字符串/数字/日期/内嵌文档/数组等)

    MongoDB的文档类似于JSON,JSON只是一种简单的表示数据的方式,只包含了6种数据类型(null、布尔、数字、字符串、数组及对象). JSON的数据类型的局限性: 1.无日期类型,对日期型的处理较为繁琐 2.无法区分浮点数和...

    电子书:MongoDB权威指南(中文版)

    514.3.4 查询内嵌文档 534.4 $where 查询 554.5 游标 564.5.2 避免使用skip 略过大量结果 584.5.3 高级查询选项 604.5.4 获取一致结果 614.6 游标内幕 63第5 章 索引 655.1 索引简介 655.1.1 ...

    mongodb中使用distinct去重的简单方法

    该命令适用于普通字段,数组字段和数组内嵌文档. mongodb的distinct的语句: 代码如下: db.users.distinct(‘last_name’) 等同于 SQL 语句: 代码如下: select DISTINCT last_name from users 表示的是根据...

    MongoDB权威指南(中文版)高清

    494.3.1 null 494.3.2 正则表达式 504.3.3 查询数组 514.3.4 查询内嵌文档 534.4 $where查询 554.5 游标 564.5.1 limit、skip和sort 574.5.2 避免使用skip略过大量结果 584.5.3 高级查询选项 604....

    深入云计算 MongoDB管理与开发实战详解pdf.part1

    2.4.5 内嵌文档类型 2.4.6 _id键和ObjectId对象 2.5 MongoDB的下载和安装 2.5.1 MongoDB的下载 2.5.2 在Windows平台下的下载与安装 2.5.3 在Linux平台下的下载与安装 2.6 MongoDB shell的使用 ...

    深入云计算 MongoDB管理与开发实战详解pdf.part2

    2.4.5 内嵌文档类型 2.4.6 _id键和ObjectId对象 2.5 MongoDB的下载和安装 2.5.1 MongoDB的下载 2.5.2 在Windows平台下的下载与安装 2.5.3 在Linux平台下的下载与安装 2.6 MongoDB shell的使用 ...

    mongodb-win32-x86_64-2008plus-ssl-v3.4-latest-signed.msi

    查询指令使用JSON形式的标记,可轻易查询文档中内嵌的对象及数组。 MongoDb 使用update()命令可以实现替换完成的文档(数据)或者一些指定的数据字段 。 Mongodb中的Map/reduce主要是用来对数据进行批量处理和聚合...

    MongoDB进阶之动态字段设计详解

    本文主要介绍的是关于MongoDB动态字段设计的相关资料,分享出来供大家参考学习,需要的朋友们下面来一起看看详细的介绍吧。 适宜读者人群 MongoDB开发者 ...内嵌文档索引 // 假如我们的文档长成了Object

    MongoDB:基本知识

    mongo是一个高可用、分布式、面向集合的,模式自由的文档数据库。 mongo和传统关系数据库的最本质的区别在那里呢?就是其文档模型。 如何考虑MongoDB 文档模式设计的基本策略呢?一般建议的是先考虑内嵌,但是有一些...

    mongoDB中聚合函数java处理示例详解

    最近在做项目的时候碰到一个对mongoDB的数据处理,从MongoDB中拿到内嵌文档的时间排序的list。 一开始考虑到直接对mongoDB中的属性排序,后面发现属性存在内嵌文档中,所以处理中需要用到聚合函数。 思考 (key)...

    MongoDB中的参数限制与阀值详析

    文档内嵌深度:BSON文档的结构(tree)深度最大为100。 二、Namespaces collection命名空间:.,最大长度为120字节。这也限定了database和collection的名字不能太长。 命名空间的个数:对于MMAPV1引擎,个数最大...

    mongodb 修改器($inc/$set/$unset/$push/$pop/upsert)

    用来指定复杂的操作,比如增加、删除或者调整键,还可能是操作数组或者内嵌文档。 1.$inc 这个修改器干什么使的呢?看看下面示例的具体操作后的结果即可知道。 示例文档:{“uid”:”201203″,”type”:”1″,size:...

    mongodb增删改查详解_动力节点Java学院整理

    上一篇也说过,文档是采用“K-V”格式存储的,如果大家对JSON比较熟悉的话,我相信学mongodb是手到擒来,我们知道JSON里面Value 可能是“字符串”,可能是“数组”,又有可能是内嵌的一个JSON对象,相同的方式也适合...

    springboot参考指南

    使用Spring Data JPA和Mongo仓库 x. 67.10. 将Spring Data仓库暴露为REST端点 vii. 68. 数据库初始化 i. 68.1. 使用JPA初始化数据库 ii. 68.2. 使用Hibernate初始化数据库 iii. 68.3. 使用Spring JDBC初始化数据库 ...

Global site tag (gtag.js) - Google Analytics