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.mfbz.cn/a/747189.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

进程、CPU、MMU与PCB之间的关系

目录 进程与cpu&#xff08;中央处理器&#xff09; 源代码、程序、cpu与进程的关系 cpu超线程 CPU的简易架构与处理数据过程 进程与MMU&#xff08;内存管理单元&#xff09; mmu作用 cpu和mmu的关系 进程与PCB&#xff08;进程控制块&#xff09; PCB介绍与内部成员…

嵌入式项目分享| 终极智能手表,全过程+全开源分享

这是一个非常完整的智能手表开源项目,功能齐全,且资料开源,如果你是:自己平时喜欢diy的工程师,想要提升开发技能的学生,马上要做毕设的大四学生,这个手表很值得一做,别错过了~~ 所有开源的资料以及原文链接见文末。 先来看下这个手表的功能: 首先,是一个可以佩戴的手…

如何在 SwiftUI 视图中显示应用图标和版本

文章目录 前言获取应用图标获取应用版本创建 SwiftUI 视图总结前言 在应用中显示应用图标和版本是为用户提供快速识别应用版本和变体的好方法,无论是内部用户(如测试人员或利益相关者)还是外部用户。 在本文中,我将展示如何创建一个可访问的 SwiftUI 视图,既能显示应用图…

【UE5.3】笔记4-自定义材质蓝图

正常来说&#xff0c;我们都是拿到什么材质用什么材质&#xff0c;那么我们如何去创建自定义的材质呢&#xff1f; 首先&#xff0c;创建MyMaterials文件夹用来存放我们自制的材质&#xff1b; 然后&#xff0c;右键创建一个材质&#xff0c;起个名字&#xff0c;双击打开&am…

深入学习Java1415新特性

一、超实用的Java14新特性 1.Java14新特性概述 2.环境安装 3.超实用新特性

大学物理(下)笔记

摘录来自笔记网站的笔记。笔记网站详见https://onford.github.io/Notes/。 大学物理&#xff08;下&#xff09;笔记 部分常用物理常量的计算值 C h a p t e r 9 Chapter9 Chapter9 恒定磁场 毕奥-萨伐尔定律 磁场和电场在很多性质上是有共性的&#xff0c;很多时候可以拿它…

番外篇 | YOLOv8改进之利用轻量化卷积PConv引入全新的结构CSPPC来替换Neck网络中的C2f | 模型轻量化

前言:Hello大家好,我是小哥谈。本文使用轻量化卷积PConv替换Neck中C2f模块中Bottleneck里的传统卷积核得到CSPPC模块,使得模型更加轻量化。🌈 目录 🚀1.基础概念 🚀2.网络结构 🚀3.添加步骤 🚀4.改进方法 🍀🍀步骤1:block.py文件修改 🍀🍀步…

尚品汇-(七)

&#xff08;1&#xff09;在网关中实现跨域 全局配置类实现 包名&#xff1a;com.atguigu.gmall.gateway.config 创建CorsConfig类 Configuration public class CorsConfig {Beanpublic CorsWebFilter corsWebFilter(){// cors跨域配置对象CorsConfiguration configuration…

替代 if else -------策略模式

1.定义策略接口 策略接口 /*** 车辆事件接口*/ public interface CarEvent {/*** 车辆状态变更事件*/void carStatusChangeEvent(); }2.定义各种策略 定义各种实现策略&#xff0c;电子围栏、实时数据 等都实现这个接口。 电子围栏 /*** 电子围栏 ElectronicFence*/ Servi…

从0开始C++(五):友元函数运算符重载

相关文章&#xff1a; 从0开始C&#xff08;一&#xff09;&#xff1a;从C到C 从0开始C&#xff08;二&#xff09;&#xff1a;类、对象、封装 从0开始C&#xff08;三&#xff09;&#xff1a;构造函数与析构函数详解 从0开始C&#xff08;四&#xff09;&#xff1a;作…

学习入门 chatgpt原理 一

学习文章&#xff1a;人人都能看懂的chatGpt原理课 笔记作为学习用&#xff0c;侵删 Chatph和自然语言处理 什么是ChatGpt ChatGPT&#xff08;Chat Generative Pre-training Transformer&#xff09; 是一个 AI 模型&#xff0c;属于自然语言处理&#xff08; Natural Lang…

视频分享的二维码怎么做?多种视频可用的二维码制作技巧

视频分享的快捷操作技巧可以在二维码生成器上来制作&#xff0c;与传统分享方式相比用二维码的方法能够更快捷&#xff0c;有利于用户能够在不下载视频占用空间的同时&#xff0c;就能够扫描二维码观看视频内容。视频二维码能够应用于很多的场景下&#xff0c;那么制作一个视频…

云服务器部署LNMP Web环境教程合集(多版linux系统安装方法)

LNMP环境包括Linux、Nginx、MySQL和PHP&#xff0c;Nginx是一款小巧而高效的Web服务器软件&#xff0c;使用阿里云服务器搭建LNMP Web网站环境很简单&#xff0c;支持多种LNMP环境部署教程&#xff0c;可使用ROS模板部署、LNMP镜像以及基于不同Linux操作系统手动部署LNMP全流程…

MeshAnything:艺术家级别的自回归3D网格生成

MeshAnything: Artist-Created Mesh Generation with Autoregressive Transformers &#x1f4dc; 文献卡 MeshAnything: Artist-Created Mesh Generation with Autoregressive Transformers作者: Yiwen Chen; Tong He; Di Huang; Weicai Ye; Sijin Chen; Jiaxiang Tang; Xin…

酒店设施和维修管理后台系统

摘 要 随着旅游业的快速发展和酒店行业的蓬勃增长&#xff0c;酒店行业成为了现代社会中不可或缺的一部分。酒店作为提供住宿、餐饮和其他服务的场所&#xff0c;需要保证设施的正常运行和及时维修&#xff0c;以提供良好的客户体验和满足客户需求。然而传统的手动管理方式往往…

「6.25更新日志」JVS·智能BI、逻辑引擎(服务编排)功能更新说明

项目介绍 JVS是企业级数字化服务构建的基础脚手架&#xff0c;主要解决企业信息化项目交付难、实施效率低、开发成本高的问题&#xff0c;采用微服务配置化的方式&#xff0c;提供了 低代码数据分析物联网的核心能力产品&#xff0c;并构建了协同办公、企业常用的管理工具等&am…

React的路由(ReactRouter)-路由导航跳转

1.第一步 // createBrowserRouter路由 RouterProvider组件 import {createBrowserRouter,RouterProvider} from react-router-dom // 创建router实例对象&#xff0c;并配置路由对应关系 const routercreateBrowserRouter([{path:/login,element:<div>我是登录页</di…

【ARM】内存属性Memory Attributes (MemAttr)

目录 1. EWA 2. Device 3. Cacheable 4. Allocate 5. 内存属性的传播 6. 事务属性组合 7. Memory Type 内存属性Memory Attributes (MemAttr) 包含Early Write Acknowledgment (EWA), Device, Cacheable, 以及Allocate。 1. EWA EWA&#xff0c;Early Write Acknowledg…

Jenkins 创建流水线任务

Jenkins是一个流行的持续集成&#xff08;Continuous Integration&#xff0c;CI&#xff09;工具。 Jenkins 创建任务 选择“流水线”类型&#xff0c;该类型的优点是定制化程度非常高 &#xff08;可选&#xff09;添加“参数化构建” 配置仓库选项(ssh连接、分支)和凭据…

一本好的电子画册应这样做,你做对了吗?

​一本好的电子画册&#xff0c;不仅要有吸引人的图文&#xff0c;还可能包括视频、音频等多媒体元素&#xff0c;为读者提供全方位的阅读体验。连贯性是指画册的整体设计风格、内容布局要协调一致&#xff0c;让读者在阅读过程中感受到流畅和自然。创新性则要求创作者在内容呈…