mongodb 查询语句学习笔记

基础查询

正则查询

{status: 'A',$or: [{ qty: { $lt: 30 } }, { item: { $regex: '^p' } }]
}

AND 查询

{ "size.h": { $lt: 15 }, "size.uom": "in", status: "D" }

OR 查询

{ $or: [ { status: "A" }, { qty: { $lt: 30 } } ] }

AND 和 OR 混合

{ status: "A", $or: [ { qty: { $lt: 30 } }, { item: /^p/ } ] }

嵌套对象查询

用点号来查询嵌套字段

这种方式写的带点号的字段必须包含在双引号之中

{ "size.h": { $lt: 15 } }
{ "size.uom": "in" }

匹配嵌套文档对象

注意❗这种查询方式是字段顺序相关的,也就是说:

{item: 'journal',qty: 25,size: { h: 14, w: 21, uom: 'cm' },status: 'A'
},// 查得到数据
{ size: { h: 14, w: 21, uom: "cm" } }// 查不到数据
{ size: { w: 21, h: 14, uom: "cm" } }

数组查询

数组类型的匹配查询时,也是顺序相关的

{ tags: ["red", "blank"] }

在这里插入图片描述

// 查询到不一样的结果
{ tags: ["blank", "red"] }

在这里插入图片描述

查询一个数组值中包含指定的复数成员, 顺序无关

{ tags: { $all: ["red", "blank"] } }

查询一个数组中是否至少包含一个指定的成员

// tags 是一个数组,查询是否有成员 red
{ tags: "red" }

查询文档中所有记录的 dim_cm 数组,获取其中至少有一个成员值大于 25 的记录

{ dim_cm: { $gt: 25 } }

比较特殊的样例, 当数组值查询时, 数组中任一成员满足其中一个条件,就会被认定为符合条件

{ dim_cm: { $gt: 15, $lt: 20 } }

比如这一条,只要 dim_cm 中有成员值大于 15 或者小于 20,本条记录就会被返回。而不是直觉上的同时满足大于 15 和小于 20

在这里插入图片描述

使用 $elemMatch 来完成复数条件查询

上面的反例,想要查询任一成员同时满足多个条件的数组时,需要用 $elemMatch

{ dim_cm: { $elemMatch: { $gt: 22, $lt: 30 } } }

对比刚刚的查询,结果数变少了

在这里插入图片描述

对固定位置的元素进行查询

使用前面嵌套字段查询提到的 . 操作符,可以对数组字段中指定位置的元素值进行查询

{ "dim_cm.1": { $gt: 25 } }

指定数组的长度条件

查询 tags 的成员数等于 3 的记录

{ "tags": { $size: 3 } }

对象数组的查询

成员值完全匹配查询

查询成员字段 warehouse = ‘A’ 和 qty = 5 的记录,顺序相关

{ "instock": { warehouse: "A", qty: 5 } }

对成员中的某个字段查询

. 操作符的使用

查询 instock 成员中 qty >= 20 的记录

{ 'instock.qty': { $lte: 20 } }

对固定位置的成员进行查询

{ 'instock.0.qty': { $gt: 10, $lte: 20 } }

查询至少一个成员满足复数条件的文档

使用 $elemMatch 可以进行复数条件查询,顺序无关。前面没有使用 $elemMatch 就是值查询,是顺序相关的。

{ "instock": { $elemMatch: { qty: 5, warehouse: "A" } } }

查询成员满足任意条件的文档

会查出有成员 qty > 10 或者 qty <= 20 的文档

{ "instock.qty": { $gt: 10,  $lte: 20 } }

另一个样例:
这里也是只要有成员满足这两个条件之一,这条记录就会被查到,不必要有一个成员同时满足两个条件。

{ "instock.qty": 5, "instock.warehouse": "A" }

在这里插入图片描述

查询成员字段同时满足多个条件

这个例子官方文档没有提到, 和上面的对比是现在至少一个成员的 qty 值要同时满足两个条件才会被查到

{ "instock": { $elemMatch: { qty: { $gt: 10,  $lte: 20  } }  } }

总结一下的点操作符用到的场景

  1. 嵌套对象字段查询
{ "size.h": { $lt: 15 } }
{ "size.uom": "in" }
  1. 数组固定位置的元素进行查询
{ "dim_cm.1": { $gt: 25 } }
  1. 对象数组中对成员字段进行查询
{ 'instock.qty': { $lte: 20 } }
  1. 对象数组中对固定位置的成员进行查询
{ 'instock.0.qty': { $gt: 10, $lte: 20 } }

Project 返回你想要的字段

基础使用

在填写 project 的地方传入下面的对象,返回的记录中就只会有 itemstatus 和一个默认的 _id 字段

{ item: 1, status: 1 }

在这里插入图片描述

删除 _id

不想要 _id 就在 project 里面给个 0 值就行

{ item: 1, status: 1, _id: 0 }

在这里插入图片描述

上面的语句同时使用了 1 来标记需要展示字段,和 0 来删除 _id,这种用法仅限于 _id 字段

仅删除不需要的字段

有时需要显示的字段很多,不需要的很少,可以仅用 0 删除不需要的字段。

{ status: 0, instock: 0 }

在这里插入图片描述

嵌套对象的 Project

就用前面学到的 . 操作符就好了

{ item: 1, status: 1, "size.uom": 1 }

在这里插入图片描述

仅删除不要字段也是给个 0 就行

{ "size.uom": 0 }

对象数组中的 Project

返回结果的 instock 数组成员仅有 qty 字段

{ item: 1, status: 1, "instock.qty": 1 }

在这里插入图片描述

数组元素的 Project

  • $elemMatch

对数组元素的 Project 会复杂一些,官方提供了三种操作:
$elemMatch, $slice, $

首先是前面见得比较多的 $elemMatch, 当这个从操作出现在 Project 里面时,就是对数组字段的成员进行筛选,返回符合条件第一个成员。

{"students": { $elemMatch: { age: { $gte: 10, $lte: 20 } } }}

在这里插入图片描述

  • $slice

对数组成员进行切片,三种语法

$slice: 正数
返回数组的前 2 个成员

{"students": { $slice: 2 }}

$slice: 负数
返回数组的后 2 个成员

{"students": { $slice: -2 }}

$slice: [n, m]
先跳过数组的前 n 个成员,再返回 m 个成员

{"students": {$slice: [1, 2]}}
  • $

这个符号需要在查询时有对数组字段附加了查询条件,这样就可以在 Project 时用这个符号来返回符合查询条件的第一个成员

query: {zipcode: "63109", "students.age": { $gt: 10 }}
project: {"students.$": 1}

在这里插入图片描述

管道 Aggregation (持续更新,创作中)

管道可以说是 MongoDB 最核心的东西了。

$unwind

对一个数组字段 $unwind, 就会将数组的每个成员当成输入,然后根据情况不断替换原来的数组字段,并产生一个新的文档

举例:

{ "_id" : 1, "item" : "ABC1", sizes: [ "S", "M", "L"] }

对 sizes 进行 $unwind

db.inventory.aggregate( [ { $unwind : "$sizes" } ] )

得到结果:
原本的数组成员被展开了,分别替换原来的数组字段形成新的文档

{ "_id" : 1, "item" : "ABC1", "sizes" : "S" }
{ "_id" : 1, "item" : "ABC1", "sizes" : "M" }
{ "_id" : 1, "item" : "ABC1", "sizes" : "L" }

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/37942.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2024年机动车签字授权人题库,助你冲刺!绝对不会让你后悔!

61.&#xff08;&#xff09;使汽车按驾驶人选定的方向行驶。 A.传动系统 B.行驶系统 C.转向系统 D.制动系统 答案&#xff1a;C 62.&#xff08;&#xff09;使汽车各总成及部件安装在适当的位置&#xff0c;对全车起支承作用以保证汽车正常行驶。 A.传动系统 B.行驶系…

01.计算机图形学概述

01.计算机图形学概述 从技术的角度上看&#xff0c;什么是一个好的画面&#xff1f; 直接看这个画面是不是足够亮&#xff0c;这体现了渲染中的一个技术叫全局光照。 应用范围 游戏&#xff08; Video Games&#xff09;电影/特效&#xff08; Movies&#xff09;动漫/动画&…

如何让Linux系统变得更安全?

本文尝试从linux安全加固、漏洞利用及防御措施、安全意识三个方面思考如何让linux系统变得更加安全. 一、linux常见安全加固操作 对Linux系统进行详细的安全加固操作,可以从多个方面进行,包括系统更新和补丁管理、用户和权限管理、网络安全配置、文件和系统安全、日志和审计…

Qt代码分析

要使用代码分析工具&#xff0c;请在Analyze菜单或(Start Debugging of Startup Project)按钮的下拉菜单中选择它。当您处于调试模式时&#xff0c;您可以通过在调试器工具栏上的菜单中选择工具来切换工具。 您可以将调试模式下的视图拖放到屏幕上的新位置。意见的大小和立场将…

c++关键字default,delete

文章目录 概述defaultdelete 小结 概述 在看一些开源项目的源码的时候&#xff0c;经常会看到default和delete。这2个关键字究竟什么意思呢&#xff1f;这篇文章就来一点一点拆解下。 default 默认构造函数、拷贝构造函数、移动构造函数、拷贝赋值运算符、移动赋值运算符和析…

HDFS学习

3.5 HDFS存储原理 3.5.1 冗余数据保存 作为一个分布式文件系统&#xff0c;为了保证系统的容错性和可用性&#xff0c;HDFS采用了多副本方式对数据进行冗余存储&#xff0c;通常一个数据块的多个副本会被分布到不同的数据节点上。 如图所示&#xff0c;数据块1被分别存放到…

石油化工厂为什么要用专业防爆手机?

防爆手机之所以必须使用专业设计的产品&#xff0c;主要是出于安全考虑&#xff0c;以防止在易燃易爆环境中因手机使用不当引发爆炸事故。以下几点详细解释了使用专业化工防爆手机的必要性&#xff1a; 本质安全设计&#xff1a;顶坚专业防爆手机采用了本质安全&#xff08;本安…

动手学深度学习(Pytorch版)代码实践 -计算机视觉-47转置卷积

47转置卷积 import torch from torch import nn from d2l import torch as d2l# 输入矩阵X和卷积核矩阵K实现基本的转置卷积运算 def trans_conv(X, K):h, w K.shapeY torch.zeros((X.shape[0] h - 1, X.shape[1] w - 1))for i in range(X.shape[0]):for j in range(X.shap…

昇思25天学习打卡营第5天|数据变换Transforms

数据变换Transforms 介绍Transforms分类Common TransformsVision TransformsText TransformsPythonTokenizer LookupLambda Transforms 参考 介绍 MindSpore提供不同种类的数据变换&#xff08;Transforms&#xff09;&#xff0c;配合数据处理Pipeline来实现数据预处理。 所有…

【ROS】apt 找不到 ROS版本?(ROS1和ROS2通用方案)

问题描述 安装ROS底层系统时&#xff0c;经常遇到一个情况就是apt找不到ros的对应版本 解决方案 添加ros官方给的apt源和安装密钥 ROS1 # ros奖项 sudo sh -c echo "deb http://packages.ros.org/ros/ubuntu $(lsb_release -sc) main" > /etc/apt/sources.li…

数学建模 —— MATLAB中的向量

目录 向量的创建方法 (1)直接输入法 (2)冒号法&#xff08;常用&#xff09; (3)利用MATLAB函数创建 linspace函数 logspace函数 向量元素的引用 (1)单个元素引用 (2)多个元素引用 向量元素的修改和删除 向量的创建方法 在 MATLAB中&#xff0c;向量的创建方法主要有…

微软Edge浏览器多用户配置文件管理:个性化浏览体验

在家庭或工作环境中&#xff0c;经常需要在同一台计算机上为多个用户创建和管理独立的浏览体验。微软Edge浏览器提供了多用户配置文件管理功能&#xff0c;允许用户为每个账户设置独立的书签、历史记录、密码、扩展和设置。本文将详细介绍如何在微软Edge中管理多个用户配置文件…

连接Sql Server时报错:无法通过使用安全套接字层加密与 SQL Server 建立安全连接

JDBC连接Sql Server时报错:无法通过使用安全套接字层加密与 SQL Server 建立安全连接 前言解决办法一解决办法二总结 前言 今天使用jdbc连接sql server突然报错为&#xff1a;SQLServerException: “Encrypt”属性设置为“true”且 “trustServerCertificate”属性设置为“fals…

GoMate:配置化模块化的Retrieval-Augmented Generation (RAG) 框架

文章目录 GoMate简介1.1 GoMate的核心技术文档解析向量存储嵌入模型问题查询文本生成文档更新 1.2 GoMate的应用领域智能客服知识库构建内容生成教育培训法律文书处理 GoMate的产品特色2.1 文档解析2.2 向量存储2.3 嵌入模型2.4 问题查询2.5 文本生成2.6 文档更新 GoMate的使用…

解决SPA(单页应用)首屏加载速度慢

SPA是目前流行的前端开发模式&#xff0c;相对于传统的多页面用户体验更好&#xff0c;操作更顺畅&#xff0c;开发效率也更高。但是SPA首屏加载速度慢一直是个致命的问题&#xff0c;由于SPA应用首次打开需要一次性加载大量的静态资源&#xff0c;这就导致了加载速度慢的问题&…

监听设备方向变化?分享 1 段优质 JS 代码片段!

大家好&#xff0c;我是大澈&#xff01; 本文约 700 字&#xff0c;整篇阅读约需 1 分钟。 每日分享一段优质代码片段。 今天分享一段 JS 代码片段&#xff0c;用于在H5端监听设备方向的变化。 老规矩&#xff0c;先阅读代码片段并思考&#xff0c;再看代码解析再思考&#…

文件夹内-资源名称前加序号排列

问题&#xff1a;在文件夹下的资源可以按时间排序&#xff0c;导入unity后资源顺序会乱掉&#xff0c;不方便按顺序赋值&#xff0c;为了方便&#xff0c;通过下面方法在文件夹下统一在资源名称前按顺序加上序号 win11在文件夹内右键&#xff0c;选择——在终端中打开 输入&a…

制造企业用AI可以做什么?

ChatGPT横空出世&#xff0c;有关AI的浪潮席卷全球&#xff0c;比起人工智能如何改变世界&#xff0c;可能你更感兴趣我能用AI可以做的事情是什么&#xff1f; 制造企业用AI可以做的事情是什么?人工智能在制造企业中可以做很多事情&#xff0c;以下是一些主要的应用&#xff1…

企业源代码加密软件丨透明加密技术是什么

在一个繁忙的软件开发公司中&#xff0c;两位员工小李和小张正在讨论源代码安全的问题。 “小张&#xff0c;你有没有想过我们的源代码如果被泄露了怎么办&#xff1f;”小李担忧地问。 “是啊&#xff0c;这是个大问题。源代码是我们的核心竞争力&#xff0c;一旦泄露&#…

LUA 语言中subtree 的使用教程

在线编辑器&#xff1a; https://www.runoob.com/try/runcode.php?filenameHelloWorld&typelua 在Lua语言中&#xff0c;"subtree"通常指的是一个子表或者子树&#xff0c;它指的是一个Lua表&#xff08;table&#xff09;中的一个部分&#xff0c;可以是一个单…