Mongodb查询投射中使用$符号

2024-01-28 16:12

本文主要是介绍Mongodb查询投射中使用$符号,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

数组是mongodb文档类型中一个重要的类型。mongodb查询当中,往往要按照要求,返回数组中的元素。在投射中使用$符号,返回符合查询条件的第一个数组元素。

定义

数组定位符号$,限定返回数组中第一个匹配查询条件的数组元素。当用户只想返回数组中一个指定元素时,在find()或findOne()方法的投射文档中,在数组字段后添加.$符号。

使用注意事项

  • 在投射中,使用$和$elemMatch操作符,都可以按照指定查询条件,返回数组中第一个匹配的元素。
  • 使用$符号时,按照用户定义的查询条件返回第一个数组文档。
  • 使用$elemMatch操作符时,用户可以显示的重新定义过滤条件。允许用户在投射文档中,添加查询条件中不存在的字段。也允许用户基于嵌套文档数组类型中多个字段,构建过滤条件。
  • 视图查询中,不支持投射中使用$符号。

语法

返回符合查询条件的第一个数组元素

db.collection.find({<array>: <condition> ...,}, //数组查询条件{"<array.$>": 1} //投射中使用$符号
)db.collection.find({<array.field>: <condition> ...,}, //嵌套文档数组中,使用文档字段作为查询条件{"<array.$>": 1} //投射中使用$符号
)

注意版本4.4前后的差异。4.4版本前,在查询条件中,必须有数组定义。而在4.4版本以后,无需这样的要求。

db.collection.find({<someOtherArray>: <condition> ...},//定义其他数组{"<array>.$": 1}
)

当在投射使用$符号时,查询文档中的数组必须与投射中使用的数组具有相同的长度。若长度不同,在某些场景中会报错。

投射中使用$时数组字段限制

在对数组进行投射时,mongodb有下面的限制。

  • 投射文档中只能出现一个$符号
  • 查询文档中只能出现一个数组查询条件。多余的查询条件可能因此未知的行为。如下面的查询语句,可能引起未知的行为
db.collection.find( { <array>: <value>, <someOtherArray>: <value2>},{"<array>.$": 1})
  • 对嵌套文档数组的查询条件,应该只包含一个字段的查询条件。多个查询条件在mongodb内部会被覆盖而导致位置错误。通过$elemMatch查询操作符,指定多个字段的查询条件。下面的查询语句中,返回了grades数组中,mean字段大于70,grade字段大于90的数据。
db.students.find( {grades: {$elemMatch: {mean: {$gt: 70},grade: {$gt: 90}}
}}, {"grades.$": 1
})

当使用多个查询条件时,需要使用$elemMatch操作符。

排序和$操作符

在find()查询中包含排序时,sort()操作符执行先于$投射操作符。当查询文档中包含多个相同字段的查询条件并且sort中也包含这个重复的字段时,返回结果可能无法反映正确的排序。因为排序在$投射前发生。

$操作符的限制

4.4版本以后,投射中的$操作符,只能位于投射字段定义中的最后。

如下面的语句中,$符号位置是错误的。

db.inventory.find({}, {"instock.$.qty": 1})

为了解决这个错误,删除$后的'.qty'。

在前面的版本中,mongodb会忽略$符号后面的字段定义。按照"instock.$"来返回。

$操作符和$slice

4.4版本以后,find与findAndModify投射定义中,不可以包含$slice。

下面的语句是错误的

db.inventory.find({"instock.qty": {$gt: 25}}, {"instock.$": {$slice: 1}})

应用举例

构建测试集合students.向集合中插入5条数据,其中grades字段是数组类型,包含三个数字的数组。

db.students.drop()
db.students.insertMany([{ "_id" : 1, "semester" : 1, "grades" : [ 70, 87, 90 ] },{ "_id" : 2, "semester" : 1, "grades" : [ 90, 88, 92 ] },{ "_id" : 3, "semester" : 1, "grades" : [ 85, 100, 90 ] },{ "_id" : 4, "semester" : 2, "grades" : [ 79, 85, 80 ] },{ "_id" : 5, "semester" : 2, "grades" : [ 88, 88, 92 ] },{ "_id" : 6, "semester" : 2, "grades" : [ 95, 90, 96 ] }
])

查询第一学期中,grades大于等于85的学生记录。在返回文档中,返回第一个匹配的grades数据

db.students.find({semester: 1, grades: {$gte: 85}},{"grades.$": 1}
)

向集合中插入另外两条数据。其中grades是文档数组类型的字段。

db.students.insertMany([
{ "_id" : 7, semester: 3, "grades" : [ { grade: 80, mean: 75, std: 8 },{ grade: 85, mean: 90, std: 5 },{ grade: 90, mean: 85, std: 3 } ] },
{ "_id" : 8, semester: 3, "grades" : [ { grade: 92, mean: 88, std: 8 },{ grade: 78, mean: 90, std: 5 },{ grade: 88, mean: 85, std: 3 } ] }
])

查询mean大于70的学生数据,返回第一个匹配的grades数据

db.students.find({semester: 3, 'grades.mean': {$gt: 70}},{"grades.$": 1})

这篇关于Mongodb查询投射中使用$符号的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/654129

相关文章

Python使用FastAPI实现大文件分片上传与断点续传功能

《Python使用FastAPI实现大文件分片上传与断点续传功能》大文件直传常遇到超时、网络抖动失败、失败后只能重传的问题,分片上传+断点续传可以把大文件拆成若干小块逐个上传,并在中断后从已完成分片继... 目录一、接口设计二、服务端实现(FastAPI)2.1 运行环境2.2 目录结构建议2.3 serv

MyBatis分页查询实战案例完整流程

《MyBatis分页查询实战案例完整流程》MyBatis是一个强大的Java持久层框架,支持自定义SQL和高级映射,本案例以员工工资信息管理为例,详细讲解如何在IDEA中使用MyBatis结合Page... 目录1. MyBATis框架简介2. 分页查询原理与应用场景2.1 分页查询的基本原理2.1.1 分

Spring Security简介、使用与最佳实践

《SpringSecurity简介、使用与最佳实践》SpringSecurity是一个能够为基于Spring的企业应用系统提供声明式的安全访问控制解决方案的安全框架,本文给大家介绍SpringSec... 目录一、如何理解 Spring Security?—— 核心思想二、如何在 Java 项目中使用?——

springboot中使用okhttp3的小结

《springboot中使用okhttp3的小结》OkHttp3是一个JavaHTTP客户端,可以处理各种请求类型,比如GET、POST、PUT等,并且支持高效的HTTP连接池、请求和响应缓存、以及异... 在 Spring Boot 项目中使用 OkHttp3 进行 HTTP 请求是一个高效且流行的方式。

Java使用Javassist动态生成HelloWorld类

《Java使用Javassist动态生成HelloWorld类》Javassist是一个非常强大的字节码操作和定义库,它允许开发者在运行时创建新的类或者修改现有的类,本文将简单介绍如何使用Javass... 目录1. Javassist简介2. 环境准备3. 动态生成HelloWorld类3.1 创建CtC

使用Python批量将.ncm格式的音频文件转换为.mp3格式的实战详解

《使用Python批量将.ncm格式的音频文件转换为.mp3格式的实战详解》本文详细介绍了如何使用Python通过ncmdump工具批量将.ncm音频转换为.mp3的步骤,包括安装、配置ffmpeg环... 目录1. 前言2. 安装 ncmdump3. 实现 .ncm 转 .mp34. 执行过程5. 执行结

Java使用jar命令配置服务器端口的完整指南

《Java使用jar命令配置服务器端口的完整指南》本文将详细介绍如何使用java-jar命令启动应用,并重点讲解如何配置服务器端口,同时提供一个实用的Web工具来简化这一过程,希望对大家有所帮助... 目录1. Java Jar文件简介1.1 什么是Jar文件1.2 创建可执行Jar文件2. 使用java

C#使用Spire.Doc for .NET实现HTML转Word的高效方案

《C#使用Spire.Docfor.NET实现HTML转Word的高效方案》在Web开发中,HTML内容的生成与处理是高频需求,然而,当用户需要将HTML页面或动态生成的HTML字符串转换为Wor... 目录引言一、html转Word的典型场景与挑战二、用 Spire.Doc 实现 HTML 转 Word1

Java中的抽象类与abstract 关键字使用详解

《Java中的抽象类与abstract关键字使用详解》:本文主要介绍Java中的抽象类与abstract关键字使用详解,本文通过实例代码给大家介绍的非常详细,感兴趣的朋友跟随小编一起看看吧... 目录一、抽象类的概念二、使用 abstract2.1 修饰类 => 抽象类2.2 修饰方法 => 抽象方法,没有

MyBatis ParameterHandler的具体使用

《MyBatisParameterHandler的具体使用》本文主要介绍了MyBatisParameterHandler的具体使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参... 目录一、概述二、源码1 关键属性2.setParameters3.TypeHandler1.TypeHa