MongoDB查询内嵌文档
转载请出自出处:http://eksliang.iteye.com/blog/2177301
一、概述
有两种方法可以查询内嵌文档:查询整个文档;针对键值对进行查询。这两种方式是不同的,下面我通过例子进行分别说明。
二、查询整个文档
例如:有如下文档
db.emp.insert({ "id":"A001", "name":{ "first":"Carey", "last":"Ickes" }, "age":25 })
参考实例:查询name等于"Carey Ickes"的人可以这样查询
db.emp.find({"name":{"first":"Carey","last":"Ickes"}})这种查询会去精确匹配整个内嵌文档,如果Carey决定添加一个中间名的键,那么这个查询就用不了,因为查询条件不在与整个内嵌文档相匹配。而且这种查询还与顺序有关,如果查询条件换成{"last":"Ickes","first":"Carey"},也会什么也匹配不到。
三、键值对查询
我们一般在查询时,不会去匹配整个内嵌文档,通常只针对内嵌文档的特定键值去查询。怎么做?
答:查询文档时,可以使用"."来表示进入内嵌文档。
参考实例:
> db.emp.find({"name.last":"Ickes","name.first":"Carey"})现在,如Ickes增加了更多的键,这个查询依然会匹配他的姓跟名
四、数组里面包含内嵌文档的查询
这种查询相对来说比较复杂一点,所以内嵌文档的匹配也需要有些技巧。例如下面的博客文档中有一个commens:键用来保存别人的评论信息。
db.blog.insert({ "_id":"B001", "title":"MongoDB查询", "comments":[ {"name":"ickes","score":3,"comment":"nice"}, {"name":"xl","score":4,"comment":"nice"}, {"name":"eksliang","score":5,"comment":"nice"}, {"name":"ickes","score":6,"comment":"nice"} ] })现在要查询由ickes评论的且5分以上文章
- 不能使用db.blog.find({"comments":{"name":"ickes","score":{"$gt":5}})去查,因为内嵌文档的匹配是精确匹配,必须要匹配完整的文档,而这个查询不会匹配comment键
- 不能使用db.blog.find({"comments":{"name":"ickes","score":{"$gt":5},"comment":"nice"}})去查,还是那句话,文档的匹配时精确匹配,这里使用了$gt作为范围,所以也查不到
- 不能使用db.blog.find({"comments.name":"ickes","comments.score":{"$gt":5}})去查,前面讲查询条件的时候说过,查询条件里面的键值对会解释为AND,但是对于数组的内嵌文档他会解释为OR的关系,也就是说上面实际是这样的comments.name:ickes或者comments.score":{"$gt":5},这明显不行吗!(注意如果内嵌文档不在数组中,还是AND,所以我才把这个拿出来单独讨论)
那对于数组里面的内嵌文档到底怎么办?应该这么办,如下所示
这里需要使用"$elemMatch"操作符,仅当这种时候才使用这个操作符
参考实例:
db.blog.find({"comments":{ "$elemMatch":{"name":"ickes","score":{"$gt":5}} }})
五、返回与查询条件相匹配的任意一个数组元素
我们可以使用"$slice"操作符进行数组元素返回限制,但是当数组里面保存的是文档的时候,我就想返回与我查询条件相匹配的那个元素,其他的不要,怎么做?有技巧的哦!
文档结构如下:
db.blog.insert({ "_id":"B001", "title":"MongoDB查询", "comments":[ {"name":"ickes","score":3,"comment":"nice"}, {"name":"xl","score":4,"comment":"nice"}, {"name":"eksliang","score":5,"comment":"nice"}, {"name":"ickes","score":6,"comment":"nice"} ] })
参考实例:
db.blog.find({"comments":{ "$elemMatch":{"name":"ickes","score":{"$gt":5}}}}, {"comments.$":1}--第二个参数是限制返回数据的,别看错了,这是第二个参数 )
返回结果如下:仅返回与当前查询条件相匹配的那个内嵌文档。
{ "_id" : "B001", "comments" : [ { "name" : "ickes", "score" : 6, "comment" : "nice" } ] }
如果当前查询有多个内嵌文档匹配,只会返回第一个。
相关推荐
1.分篇章进行学习,内容控制30分钟内 2.1个月疗程,不要放弃治疗哦 3.图文并茂,有问题请发到邮箱
如果您不习惯MongoDB查询语言,那么Studio3T的SQL查询可能会派上用场。编写SQL选择表达式和SQL联接来查询mongodb,并查看SQL查询如何转换为MQL——这是一个很好的工具。SQL查询语言
NULL 博文链接:https://fantasticinblur.iteye.com/blog/650691
14、MongoDB存储原理&多文档事务详解_ev.rar14、MongoDB存储原理&多文档事务详解_ev.rar14、MongoDB存储原理&多文档事务详解_ev.rar14、MongoDB存储原理&多文档事务详解_ev.rar14、MongoDB存储原理&多文档事务详解_...
NoSQL数据库之MongoDB查询
MongoDB实现增删改查,java程序驱动,复杂查询,源代码示例
mongoDB中文文档和一个可以运行的dome,其中包括mongoDB索引,管道,事务,集合和crud等基本操作
mongod.exe --install --dbpath=d:\mongodb\data --logpath=d:\mongodb\log\log.log -auth -serviceName "serviceName" 2.卸载服务 mongod.exe --remove --serviceName "serviceName" 3.启动服务 ...
2.了解NoSQL和文档数据库 3.要求 4.其他帮助资源 4.1。支持 4.1.1。社区论坛 4.1.2。专业支持 4.2。发展之后 5.新&值得注意的 5.1。Spring Data MongoDB 2.1中的新特性 5.2。Spring Data MongoDB 2.0中的新特性 5.3...
mongodb官网下载速度非常慢,故上传一个windows系统64bit的安装包及java的api文档
常见NoSQLj介绍——MongoDB 常见NoSQL介绍——MongoDB 常见NoSQL介绍——MongoDB 常见NoSQL介绍——MongoDB 常见NoSQL介绍——MongoDB 常见NoSQL介绍——MongoDB 常见NoSQL介绍——MongoDB 常见NoSQL介绍——MongoDB...
基于MongoDB JSON的查询方法和字段限制 11.3.4。基于JSON的SpEL表达式查询 11.3.5。类型安全的查询方法 11.3.6。全文搜索查询 11.3.7。预测 11.4。杂 11.4.1。CDI集成 12.反应性MongoDB存储库 12.1。介绍 12.2。活性...
1.分篇章进行学习,内容控制30分钟内 2.1个月疗程,不要放弃治疗哦 3.图文并茂,有问题请发到邮箱
mongoDb导入数据csv 说明文档
MongoDB权威指南+官方文档MongoDB数据库文档MongoDB数据库文档
很全面的mongodb 查询语法和实例 $gt $lt $gte $lte $exists $size $type 等等
mongodb 常用查询语法包括分页等用法
Mongodb安装https配置文档
MongoDB高级查询用法大全
MongoDB基本查询.pdf 学习资料 复习资料 教学资源