百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术文章 > 正文

系统学习MongoDB(四)史上最全MongoDB查询API讲解

itomcoil 2025-02-24 16:47 20 浏览

在MongoDB中有两种方式查询数据库里的数据,即CURD查询和聚合管道查询。本章将对CURD查询进行详细讲解。

准备数据

??db.inventory.insertMany([
   { item: "journal", qty: 25, size: { h: 14, w: 21, uom: "cm" }, status: "A" },
   { item: "notebook", qty: 50, size: { h: 8.5, w: 11, uom: "in" }, status: "A" },
   { item: "paper", qty: 100, size: { h: 8.5, w: 11, uom: "in" }, status: "D" },
   { item: "planner", qty: 75, size: { h: 22.85, w: 30, uom: "cm" }, status: "D" },
   { item: "postcard", qty: 45, size: { h: 10, w: 15.25, uom: "cm" }, status: "A" }
]);

查询全部的inventory数据

db.inventory.find( {} )  //相当于select* from inventory

查询item是paper的数据

db.inventory.find( { status: "D" } ) //条件就是在find中使用{ : , ... }进行匹配

结果:

多个条件and

db.inventory.find( { status: "A", qty: { $lt: 30 } } )//多个条件and即同时制定多个field 
//上行语句中的$lt为操作符,意思是小于  整个条件的查询为查询 
//select * from inventory where status =“A”and qty<30

多个条件or

db.inventory.find( { $or: [ { status: "A" }, { qty: { $lt: 30 } } ] } ) //使用$or操作符

既有and又有or的条件时

db.inventory.find( {
     status: "A",
     $or: [ { qty: { $lt: 30 } }, { item: /^p/ } ]
} ) //mongo条过滤时支持正则 使用/ ^p/指item满足以p开头的 像sql中的like =“q%”

上边是逻辑操作符的使用,接下来展示比较运算符的使用。

//等于$eq
{ field:  } //默认为等于 也可以写成 { : { $eq:  } }
//不等于$ne
db.inventory.find( { status: {$ne :"D" } })
//大于$gt 大于等于$gte  小于$lt 小于等于$lte 不等于 $ne 
db.inventory.find( { qty: {$gt :12} } ) //查出qty大于12的文档
 //$in 同sql中的in意为满足值在条件中的任意一个 $nin 意为not in
 db.inventory.find( { status: {$in :["D","A"] } }) //查询状态是D 或者A的

除了关系数据库有的逻辑运算符和比较运算符之外,mongo还有很多独有的能力。Mongo可以查询存在某个字段的或者不存在某个字段的文档如下:

//插入一条数据
db.inventory.insertOne([
   { item: "journal2", qty: 25, size: { h: 14, w: 21, uom: "cm" }, status: "A",from:"Chinese"}
]);
//查询文档中含有from字段的文档 我们使用$exists操作符就可以做到 
db.inventory.find({ from{$exists: true }})
//这得益于Mongo的松散结构,我们的文档不需要每个字段都一致。

当我们使用嵌套的文档格式时,还需要学习下面的查询操作

//还是我们刚才准备的数据,查询size 的宽是21 高是14的文档
db.inventory.find( { "size.h": 14 },{ "size.w": 21 } ) //字段为对象类型时条件字段我们可以使用.来连接子属性

我们的文档还可以存储数组类型的数据,数组类型的查询我们接着看:

//我们再插入几条数据
db.inventory.insertMany([
   { item: "journal", qty: 25, tags: ["blank", "red"], dim_cm: [ 14, 21 ] },
   { item: "notebook", qty: 50, tags: ["red", "blank"], dim_cm: [ 14, 21 ] },
   { item: "paper", qty: 100, tags: ["red", "blank", "plain"], dim_cm: [ 14, 21 ] },
   { item: "planner", qty: 75, tags: ["blank", "red"], dim_cm: [ 22.85, 30 ] },
   { item: "postcard", qty: 45, tags: ["blue"], dim_cm: [ 10, 15.25 ] }
]);
//查询tags中包含red的文档
db.inventory.find( { tags: "red" } )
///查询tags同时含有 red和blank的文档
db.inventory.find( { tags: { $all: ["red", "blank"] } } )
//查询数组中包含的元素任意一个大于15且任意一个小于20的文档满足条件的可以不是同一个
db.inventory.find( { dim_cm: { $gt: 15, $lt: 20 } } )
//查询数组中元素至少一个元素大于22小于30两个条件都满足
db.inventory.find( { dim_cm: { $elemMatch: { $gt: 22, $lt: 30 } } } )// $elemMatch过滤每个元素
//查询数组中指定元素满足条件的文档
db.inventory.find( { "dim_cm.0": { $gt: 25 } } ) //查询数组中第一个元素满足条件的
//查询数组的元素个数满足条件的文档
db.inventory.find( { "dim_cm": { $size: 25 } } ) 


下图为执行结果:


上图结果对比一下可以清晰理解$elemMatch和普通写法的区别。

当数组中的元素是对象时我们可以参考下面的查询操作:

//准备数据
db.inventory.insertMany( [
   { item: "journal", instock: [ { warehouse: "A", qty: 5 }, { warehouse: "C", qty: 15 } ] },
   { item: "notebook", instock: [ { warehouse: "C", qty: 5 } ] },
   { item: "paper", instock: [ { warehouse: "A", qty: 60 }, { warehouse: "B", qty: 15 } ] },
   { item: "planner", instock: [ { warehouse: "A", qty: 40 }, { warehouse: "B", qty: 5 } ] },
   { item: "postcard", instock: [ { warehouse: "B", qty: 15 }, { warehouse: "C", qty: 35 } ] }
]);
//查询数组对象中属性满足条件的文档
db.inventory.find( { 'instock.qty': { $lte: 20 } } )
//查询数组中指定元素的属性满足条件的文档
db.inventory.find( { 'instock.0.qty': { $lte: 20 } } )
//数组中只要一个元素满足条件的文档
db.inventory.find( { "instock": { qty: 5, warehouse: "A" } } )
//使用$elemMatch查询数组中任意一个元素都满足$elemMatch的条件
db.inventory.find( { "instock": { $elemMatch: { qty: { $gt: 10, $lte: 20 } } } } )

注意:db.inventory.find( { "instock": { qty: 5, warehouse: "A" } } )这个查询中嵌套文档的字段顺序也要和条件相同才会查出来,这正好和上一张讲的BSON文档的字段是有序的对应了起来。


下章整理result的操作符和update API的讲解。。

相关推荐

python创建文件夹,轻松搞定,喝咖啡去了

最近经常在录视频课程,一个课程下面往往有许多小课,需要分多个文件夹来放视频、PPT和案例,这下可好了,一个一个手工创建,手酸了都做不完。别急,来段PYTHON代码,轻松搞定,喝咖啡去了!import...

如何编写第一个Python程序_pycharm写第一个python程序

一、第一个python程序[掌握]python:python解释器,将python代码解释成计算机认识的语言pycharm:IDE(集成开发环境),写代码的一个软件,集成了写代码,...

Python文件怎么打包为exe程序?_python3.8打包成exe文件

PyInstaller是一个Python应用程序打包工具,它可以将Python程序打包为单个独立可执行文件。要使用PyInstaller打包Python程序,需要在命令行中使用py...

官方的Python环境_python环境版本

Python是一种解释型编程开发语言,根据Python语法编写出来的程序,需要经过Python解释器来进行执行。打开Python官网(https://www.python.org),找到下载页面,选择...

[编程基础] Python配置文件读取库ConfigParser总结

PythonConfigParser教程显示了如何使用ConfigParser在Python中使用配置文件。文章目录1介绍1.1PythonConfigParser读取文件1.2Python...

Python打包exe软件,用这个库真的很容易

初学Python的人会觉得开发一个exe软件非常复杂,其实不然,从.py到.exe文件的过程很简单。你甚至可以在一天之内用Python开发一个能正常运行的exe软件,因为Python有专门exe打包库...

2025 PyInstaller 打包说明(中文指南),python 打包成exe 都在这里

点赞标记,明天就能用上这几个技巧!linux运维、shell、python、网络爬虫、数据采集等定定做,请私信。。。PyInstaller打包说明(中文指南)下面按准备→基本使用→常用...

Python自动化办公应用学习笔记40—文件路径2

4.特殊路径操作用户主目录·获取当前用户的主目录路径非常常用:frompathlibimportPathhome_dir=Path.home()#返回当前用户主目录的Path对象...

Python内置tempfile模块: 生成临时文件和目录详解

1.引言在Python开发中,临时文件和目录的创建和管理是一个常见的需求。Python提供了内置模块tempfile,用于生成临时文件和目录。本文将详细介绍tempfile模块的使用方法、原理及相关...

python代码实现读取文件并生成韦恩图

00、背景今天战略解码,有同学用韦恩图展示各个产品线的占比,效果不错。韦恩图(Venndiagram),是在集合论数学分支中,在不太严格的意义下用以表示集合的一种图解。它们用于展示在不同的事物群组之...

Python技术解放双手,一键搞定海量文件重命名,一周工作量秒搞定

摘要:想象一下,周五傍晚,办公室的同事们纷纷准备享受周末,而你,面对着堆积如山的文件,需要将它们的文件名从美国日期格式改为欧洲日期格式,这似乎注定了你将与加班为伍。但别担心,Python自动化办公来...

Python路径操作的一些基础方法_python路径文件

带你走进@机器人时代Discover点击上面蓝色文字,关注我们Python自动化操作文件避开不了路径操作方法,今天我们来学习一下路径操作的一些基础。Pathlib库模块提供的路径操作包括路径的...

Python爬取下载m3u8加密视频,原来这么简单

1.前言爬取视频的时候发现,现在的视频都是经过加密(m3u8),不再是mp4或者avi链接直接在网页显示,都是经过加密形成ts文件分段进行播放。今天就教大家如果通过python爬取下载m3u8加密视频...

探秘 shutil:Python 高级文件操作的得力助手

在Python的标准库中,shutil模块犹如一位技艺精湛的工匠,为我们处理文件和目录提供了一系列高级操作功能。无论是文件的复制、移动、删除,还是归档与解压缩,shutil都能以简洁高效的方式完成...

怎么把 Python + Flet 开发的程序,打包为 exe ?这个方法很简单!

前面用Python+Flet开发的“我的计算器v3”,怎么打包为exe文件呢?这样才能分发给他人,直接“双击”运行使用啊!今天我给大家分享一个简单的、可用的,把Flet开发的程序打包为...