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

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

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

在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的讲解。。

相关推荐

selenium(WEB自动化工具)

定义解释Selenium是一个用于Web应用程序测试的工具。Selenium测试直接运行在浏览器中,就像真正的用户在操作一样。支持的浏览器包括IE(7,8,9,10,11),MozillaF...

开发利器丨如何使用ELK设计微服务中的日志收集方案?

【摘要】微服务各个组件的相关实践会涉及到工具,本文将会介绍微服务日常开发的一些利器,这些工具帮助我们构建更加健壮的微服务系统,并帮助排查解决微服务系统中的问题与性能瓶颈等。我们将重点介绍微服务架构中...

高并发系统设计:应对每秒数万QPS的架构策略

当面试官问及"如何应对每秒几万QPS(QueriesPerSecond)"时,大概率是想知道你对高并发系统设计的理解有多少。本文将深入探讨从基础设施到应用层面的解决方案。01、理解...

2025 年每个 JavaScript 开发者都应该了解的功能

大家好,很高兴又见面了,我是"高级前端进阶",由我带着大家一起关注前端前沿、深入前端底层技术,大家一起进步,也欢迎大家关注、点赞、收藏、转发。1.Iteratorhelpers开发者...

JavaScript Array 对象

Array对象Array对象用于在变量中存储多个值:varcars=["Saab","Volvo","BMW"];第一个数组元素的索引值为0,第二个索引值为1,以此类推。更多有...

Gemini 2.5编程全球霸榜,谷歌重回AI王座,神秘模型曝光,奥特曼迎战

刚刚,Gemini2.5Pro编程登顶,6美元性价比碾压Claude3.7Sonnet。不仅如此,谷歌还暗藏着更强的编程模型Dragontail,这次是要彻底翻盘了。谷歌,彻底打了一场漂亮的翻...

动力节点最新JavaScript教程(高级篇),深入学习JavaScript

JavaScript是一种运行在浏览器中的解释型编程语言,它的解释器被称为JavaScript引擎,是浏览器的一部分,JavaScript广泛用于浏览器客户端编程,通常JavaScript脚本是通过嵌...

一文看懂Kiro,其 Spec工作流秒杀Cursor,可移植至Claude Code

当Cursor的“即兴编程”开始拖累项目质量,AWS新晋IDEKiro以Spec工作流打出“先规范后编码”的系统工程思维:需求-设计-任务三件套一次生成,文档与代码同步落地,复杂项目不...

「晚安·好梦」努力只能及格,拼命才能优秀

欢迎光临,浏览之前点击上面的音乐放松一下心情吧!喜欢的话给小编一个关注呀!Effortscanonlypass,anddesperatelycanbeexcellent.努力只能及格...

JavaScript 中 some 与 every 方法的区别是什么?

大家好,很高兴又见面了,我是姜茶的编程笔记,我们一起学习前端相关领域技术,共同进步,也欢迎大家关注、点赞、收藏、转发,您的支持是我不断创作的动力在JavaScript中,Array.protot...

10个高效的Python爬虫框架,你用过几个?

小型爬虫需求,requests库+bs4库就能解决;大型爬虫数据,尤其涉及异步抓取、内容管理及后续扩展等功能时,就需要用到爬虫框架了。下面介绍了10个爬虫框架,大家可以学习使用!1.Scrapysc...

12个高效的Python爬虫框架,你用过几个?

实现爬虫技术的编程环境有很多种,Java、Python、C++等都可以用来爬虫。但很多人选择Python来写爬虫,为什么呢?因为Python确实很适合做爬虫,丰富的第三方库十分强大,简单几行代码便可实...

pip3 install pyspider报错问题解决

运行如下命令报错:>>>pip3installpyspider观察上面的报错问题,需要安装pycurl。是到这个网址:http://www.lfd.uci.edu/~gohlke...

PySpider框架的使用

PysiderPysider是一个国人用Python编写的、带有强大的WebUI的网络爬虫系统,它支持多种数据库、任务监控、项目管理、结果查看、URL去重等强大的功能。安装pip3inst...

「机器学习」神经网络的激活函数、并通过python实现激活函数

神经网络的激活函数、并通过python实现whatis激活函数感知机的网络结构如下:左图中,偏置b没有被画出来,如果要表示出b,可以像右图那样做。用数学式来表示感知机:上面这个数学式子可以被改写:...