`
eksliang
  • 浏览: 598963 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

MongoDB查询(3)——内嵌文档查询(七)

阅读更多

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分以上文章

 

  1. 不能使用db.blog.find({"comments":{"name":"ickes","score":{"$gt":5}})去查,因为内嵌文档的匹配是精确匹配,必须要匹配完整的文档,而这个查询不会匹配comment键
  2. 不能使用db.blog.find({"comments":{"name":"ickes","score":{"$gt":5},"comment":"nice"}})去查,还是那句话,文档的匹配时精确匹配,这里使用了$gt作为范围,所以也查不到
  3. 不能使用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" } ] 
}

 如果当前查询有多个内嵌文档匹配,只会返回第一个。

 

 

 

 

 

 

 

分享到:
评论

相关推荐

    NoSQL数据库MongoDB基础学习

    3. 支持动态查询,查询指令使用 JSON 形式的标记,可轻易查询文档中内嵌的对象及数组。 4. 支持完全索引,包含内部对象。 5. 支持复制和故障恢复,提供了主——从、主——主模式的数据复制及服务器之间的数据复制...

    mongodb_node.js:mongodb和node.js的基本学习,和Mongoos框架的学习CURD 和关联关系

    关联关系在关系数据库中是常见的概念,但在MongoDB中,关联关系通常通过内嵌文档、引用或分片来实现。内嵌文档是将相关数据直接存储在父文档中,适用于一对一或一对多的关系。引用是通过保存其他文档的_id来建立联系...

    第19章 非关系型数据库—NoSQL.docx

    4. 支持动态查询,查询指令也使用 JSON 形式的标记,可轻易查询文档中内嵌的对象及数组 5. 支持 javascript 表达式查询,可在服务器端执行任意的 javascript 函数 缺点: 1. 单个文档大小限制为 16M,32 位系统上...

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

    这些修改器使得我们可以执行如增加、删除、设置键值等复杂操作,甚至可以作用于数组和内嵌文档。 1. **$inc** 修改器: `$inc` 是用于增加或减少文档中数值字段的值。在提供的示例中,我们看到如何使用 `$inc` 来...

    基于SpringBoot+Vue的常规应急物资管理系统源码案例设计带文档说明.zip

    它集成了大量常用的第三方库配置,如JPA、RabbitMQ、MongoDB、WebSocket等,使得开发者能够快速创建独立的、生产级别的基于Spring的应用。在本项目中,SpringBoot负责后端业务逻辑处理、数据访问及服务提供。 1.1 ...

    基于SpringBoot设计的一起来约苗系统软件源码.zip

    在本系统中,SpringBoot可能包含了自动配置、起步依赖、内嵌Web服务器等功能,大大提高了开发效率。 接着,我们关注系统的核心功能——疫苗预约。约苗系统通常需要包含用户管理、疫苗信息管理、预约服务、通知服务...

    spring boot相关书籍

    3. **数据访问**:涉及JPA和Hibernate的集成,数据库迁移工具Flyway和Liquibase,以及对NoSQL数据库如MongoDB的支持。 4. **安全**:讲解Spring Security的使用,包括身份验证、授权、CSRF保护等安全机制。 5. **...

    favorites-web-开源项目-云收藏

    《Spring Boot 2.0 开源项目:云收藏——打造个性化建站与SNS社交系统》 "favorites-web-开源项目-云收藏"是一个基于Spring Boot 2.0框架的开源项目,旨在提供一个功能丰富的云收藏平台,让用户能够轻松收藏、管理...

    基于springboot-mqtt的温度、湿度、六氟化硫浓度实时监控系统.zip

    【标题】中的“基于springboot-mqtt的温度、湿度、六氟化硫浓度实时监控系统”揭示了这个项目是利用Spring Boot框架与MQTT(Message Queuing ...环境参数如温度、湿度以及工业环境中常见的有害气体——六氟化硫的浓度...

    spring快速入门

    AOP提供了一种模块化业务逻辑的新方法,使我们可以定义“切面”——包含关注点的模块,如日志、事务管理等,并将其与主要业务逻辑分离。Spring AOP支持在运行时织入切面,降低了代码的复杂性。 4. **Spring MVC**...

    springboot-stack-2019-7-16-9-35-9-633

    3. **内嵌Web服务器**:Spring Boot可以内嵌Tomcat或Jetty,这样应用可以直接运行为一个独立的JAR或WAR,无需额外部署到外部容器。 4. **Actuator**:Actuator提供了多种端点,用于监控和管理应用,如健康检查、...

    KinoXPBackEnd

    《KinoXPBackEnd——基于Java的后台系统详解》 KinoXPBackEnd是一个以Java技术为核心的后端系统,它的命名可能来源于“Kinetic XP”,暗示了这是一个动态、高效的后台解决方案。在深入探讨这个项目之前,我们需要...

    e-magazine-backend

    《构建电子杂志后端系统——基于Java技术栈的深度解析》 在当今信息化社会,电子杂志作为传统纸质杂志的数字化形式,已经越来越受到人们的青睐。为了支持电子杂志的高效管理和分发,一个强大的后端系统至关重要。本...

    springboot-microservice-floricultura

    描述 "springboot-微服务-floricultura" 强调了项目的核心技术栈——Spring Boot微服务,这表明该项目旨在利用微服务架构来设计和实现花卉业务的各个组件。在微服务架构中,每个服务都有特定的责任,可以独立开发、...

Global site tag (gtag.js) - Google Analytics