04 MongoDB各种查询操作 以及聚合操作总结

本文涉及的产品
云数据库 MongoDB,独享型 2核8GB
推荐场景:
构建全方位客户视图
简介: 文章全面总结了MongoDB中的查询操作及聚合操作,包括基本查询、条件筛选、排序以及聚合管道的使用方法和实例。

一. 使用 find() 方法查询文档

语法格式: db.collection.find(query, projection)

说明: find()方法以非结构化的方式来显示所有文档, 可指定参数:

query : 可选,使用查询操作符指定查询条件;
projection : 可选,使用投影操作符指定返回的键。查询时返回文档中所有键值, 只需省略该参数即可(默认省略)。

案例1: 如向集合user_demo中查询名字为zhangsan的用户:

db.user_demo.find({
   'name':'zhangsan'})

# 相当于sql中的
select * from user_demo where name = "zhangsan";

案例2: 指定返回哪些键

db.article.find({
   }, {
   "title": 1, "author": 1})

# 相当于sql中的
select title, author from article;

除了 find() 方法之外,还有一个 findOne() 方法,它只返回一个文档。

二. AND查询和OR查询

2.1 AND查询

AND查询语法格式: db.col.find({key1:value1, key2:value2})

案例1: 如向集合user_demo中查询名字为zhangsan的用户且age为20的数据:

db.user_demo.find({
   'name':'zhangsan', 'age': 20})

# 相当于sql中的
select * from user_demo where name = "zhangsan" and age = 20;
2.2 OR查询

OR查询语法格式:

db.col.find(
   {
   
      $or: [
         {
   key1: value1}, {
   key2:value2}
      ]
   }
)

案例2: 如向集合user_demo中查询名字为zhangsan的用户或age为20的数据:

db.user_demo.find({
   $or:[{
   'name':'zhangsan', 'age': 20}]})

# 相当于sql中的
select * from article where name = "zhangsan" or age = 20;

案例3: AND和OR联合使用案例,类似常规SQL语句为:

db.col.find({
   "likes": {
   $gt:50}, $or: [{
   "by": "xx教程"},{
   "title": "MongoDB 教程"}]})

# 相当于sql中的
select * from col where likes>50 AND (by = 'xx教程' OR title = 'MongoDB 教程');

三. 条件操作符

3.1 比较条件

MongoDB中条件操作符有:

(>) 大于 - $gt
(<) 小于 - $lt
(>=) 大于等于 - $gte
(<= ) 小于等于 - $lte

案例1: 获取 “col” 集合中 “likes” 大于 100 的数据:

db.col.find({
   likes : {
   $gt : 100}})

# 相当于sql中的
select * from col where likes > 100;

案例2: 获取"col"集合中 “likes” 大于等于 100 的数据:

db.col.find({
   likes : {
   $gte : 100}})

# 相当于sql中的
select * from col where likes >= 100;

案例3: 获取"col"集合中 “likes” 小于 150 的数据:

db.col.find({
   likes : {
   $lt : 150}})

# 相当于sql中的
select * from col where likes < 150;

案例4: 获取"col"集合中 “likes” 小于等于 150 的数据:

db.col.find({
   likes : {
   $lte : 150}})

# 相当于sql中的
select * from col where likes <= 150;

案例5: 获取"col"集合中 “likes” 大于100,小于 200 的数据:

db.col.find({
   likes : {
   $lt :200, $gt : 100}})

# 相当于sql中的
select * from col where likes > 100 and likes < 200;

案例6: 获取"col"集合中 “likes” 不等于100的数据:

db.col.find({
   likes : {
   "$ne": 100}})

# 相当于sql中的
select * from col where likes != 100;
3.2 in条件
select * from article where author in ("a", "b", "c")

# 相当于sql中的
db.article.find({
   "author": {
   "$in": ["a", "b", "c"]}})
3.3 like条件查询
db.article.find({
   "title": /mongodb/})

# 相当于sql中的
select * from article where title like "%mongodb%"

四. limit() 方法与 skip() 方法

4.1 控制返回数量 limit() 方法

语法格式(limit)db.COLLECTION_NAME.find().limit(NUMBER)

如显示查询文档中的两条记录:

db.col.find({
   },{
   "title":1}).limit(2)

除了可以使用limit()方法来读取指定数量的数据外,还可以使用skip()方法来跳过指定数量的数据,skip方法同样接受一个数字参数作为跳过的记录条数。

4.2 略过数量 skip() 方法

语法格式db.COLLECTION_NAME.find().limit(NUMBER).skip(NUMBER)

以下实例只会显示第二条文档数据:

db.col.find({
   },{
   "title":1).limit(1).skip(1)

# 下面是略过前5条数据,也就是从第6条开始返回。
db.article.find().skip(5)

注:skip()方法默认参数为 0 。

4.3 limit和skip结合

可以结合limit()和skip()来达到分页效果:

db.article.find().skip(10).limit(20) 

# 相当于sql中的 
select * from article limit 10, 20;

五. 排序 sort() 方法

在 MongoDB 中使用 sort() 方法对数据进行排序。

sort() 方法可以通过参数指定排序的字段,并使用 1 和 -1 来指定排序的方式,其中 1 为升序排列,而 -1 是用于降序排列。

语法格式db.COLLECTION_NAME.find().sort({KEY:1})

如在 col 集合中的数据按字段 likes 的降序排列:

db.col.find({
   },{
   "title":1}).sort({
   "likes":-1})

# 相当于sql中的
select * from col where title = 1 order by likes desc;

注意:skip(), limilt(), sort()三个放在一起执行的时候,执行的顺序是先 sort(), 然后是 skip(),最后是显示的 limit()。

六. $type 操作符

6.1 MongoDB 中可以使用的类型如下表所示:
  • Double 1
  • String 2
  • Object 3
  • Array 4
  • Binary data 5
  • Undefined 6 已废弃。
  • Object id 7
  • Boolean 8
  • Date 9
  • Null 10
  • Regular Expression 11
  • JavaScript 13
  • Symbol 14
  • JavaScript (with scope) 15
  • 32-bit integer 16
  • Timestamp 17
  • 64-bit integer 18
  • Min key 255 Query with -1.
  • Max key 127

案例: 获取 “col” 集合中 title 为 String 的数据:
db.col.find({"title" : {$type : 2}})
db.col.find({"title" : {$type : 'string'}})

6.2 多个元素的查询

案例: 只有type数组同时存在mongodb和javascript才会匹配。

db.article.find({
   "type": {
   "$all": ["mongodb", "javascript"]}})
6.3 限制数组长度查询

案例: 只有数组的长度是2才会匹配, 注:type_list必须是数组

db.article.find({
   "type_list": {
   "$size": 2}})
6.4 返回特定数量

$slice的参数是一个时,表示返回的数量;当是一个数组时,第一个参数表示偏移量,第二个表示返回的数量:

案例:返回特定数量, 注:$slice针对的是数组

db.article.find({
   "type": {
   "$slice": 1}}) // 返回第1个

db.article.find({
   "type": {
   "$slice": -1}})  // 返回最后一个

db.article.find({
   "type": {
   "$slice": [20, 10]}})  // 从第21个开始,返回10个,也就是2130

更多类型可以参考:mongodb $type

七. MongoDB特有的语句

7.1 元素匹配 ($elemMatch)

如果文档中有一个字段的值是数组,可以使用$elemMatch来匹配数组内的元素:

案例:只有a=1且b>2才会匹配。

db.article.find({
   "kown": {
    "$elemMatch": {
   a: 1, b: {
   "$gt": 2}}}})
7.2 取模($mod)

比如我们要匹配 read % 5 == 1:

db.article.find({
   "read": {
   $mod: [5, 1]}})
7.3 是否存在($exists)

如果我们要判断love字段是否存在,可以这样:

# 如果存在字段love,就返回
db.article.find({
   "love": {
   "$exists": true}})

# 我们也可以判断不存在, 如果不存在字段love,就返回
db.article.find({
   "love": {
   "$exists": false}})
7.4 正则表达式

mongodb支持正则表达式,使用方法与正则字面量一样:

# i是忽略大小写
db.article.find({
   "title": /mongodb/i})
7.5 类型查询

我们可以根据字段类型来返回数据:

# 只有当comments的类型是数组才匹配
db.article.find({
   "comments": {
   "$type": 4}})
7.6 内嵌文档

mongodb是允许内嵌文档的,而且要查询内嵌文档也很简单(使用点语法):

{
   
  address: {
    name: "nanji" }
}

db.article.find({
   "address.name": "nanji"})

数组也可以采取点语法:

{
   
  comments: [{
   title: "mongodb"}, {
   title: "javascript"}]
}

db.article.find({
   "comments.title": "mongodb"})
7.7 取反

$not是元语句,即可以用在任何其他条件之上:

db.article.find({
   "author": {
   "$not": /mongodb/i}})

只要使用$not操作符,就表示取反。

7.8 统计

返回匹配数据的长度:

db.article.find().count()
7.9 格式化

pretty()方法可以以格式化的方式显示所有文档:

db.article.find().pretty()
7.10 不等于

$ne:表示not equals 就是的意思

# 查询某字段不为空的数据
db.hfijf.find({
   fieldName: {
   $ne:null}})
# 查询字段等于空的数据
db.hfijf.find({
   fieldName: {
   $eq:null}})
相关实践学习
MongoDB数据库入门
MongoDB数据库入门实验。
快速掌握 MongoDB 数据库
本课程主要讲解MongoDB数据库的基本知识,包括MongoDB数据库的安装、配置、服务的启动、数据的CRUD操作函数使用、MongoDB索引的使用(唯一索引、地理索引、过期索引、全文索引等)、MapReduce操作实现、用户管理、Java对MongoDB的操作支持(基于2.x驱动与3.x驱动的完全讲解)。 通过学习此课程,读者将具备MongoDB数据库的开发能力,并且能够使用MongoDB进行项目开发。 &nbsp; 相关的阿里云产品:云数据库 MongoDB版 云数据库MongoDB版支持ReplicaSet和Sharding两种部署架构,具备安全审计,时间点备份等多项企业能力。在互联网、物联网、游戏、金融等领域被广泛采用。 云数据库MongoDB版(ApsaraDB for MongoDB)完全兼容MongoDB协议,基于飞天分布式系统和高可靠存储引擎,提供多节点高可用架构、弹性扩容、容灾、备份回滚、性能优化等解决方案。 产品详情: https://www.aliyun.com/product/mongodb
相关文章
|
1天前
|
SQL NoSQL Unix
MongoDB聚合操作总结
这篇文章总结了MongoDB中聚合操作的作用、方法、常见聚合表达式以及聚合管道的概念和常用操作符,以及SQL与MongoDB聚合操作的对应关系。
9 2
MongoDB聚合操作总结
|
1天前
|
NoSQL MongoDB 数据库
python3操作MongoDB的crud以及聚合案例,代码可直接运行(python经典编程案例)
这篇文章提供了使用Python操作MongoDB数据库进行CRUD(创建、读取、更新、删除)操作的详细代码示例,以及如何执行聚合查询的案例。
17 6
|
26天前
|
持续交付 jenkins Devops
WPF与DevOps的完美邂逅:从Jenkins配置到自动化部署,全流程解析持续集成与持续交付的最佳实践
【8月更文挑战第31天】WPF与DevOps的结合开启了软件生命周期管理的新篇章。通过Jenkins等CI/CD工具,实现从代码提交到自动构建、测试及部署的全流程自动化。本文详细介绍了如何配置Jenkins来管理WPF项目的构建任务,确保每次代码提交都能触发自动化流程,提升开发效率和代码质量。这一方法不仅简化了开发流程,还加强了团队协作,是WPF开发者拥抱DevOps文化的理想指南。
46 1
|
1月前
|
JSON NoSQL MongoDB
MongoDB Schema设计实战指南:优化数据结构,提升查询性能与数据一致性
【8月更文挑战第24天】MongoDB是一款领先的NoSQL数据库,其灵活的文档模型突破了传统关系型数据库的限制。它允许自定义数据结构,适应多样化的数据需求。设计MongoDB的Schema时需考虑数据访问模式、一致性需求及性能因素。设计原则强调简洁性、查询优化与合理使用索引。例如,在构建博客系统时,可以通过精心设计文章和用户的集合结构来提高查询效率并确保数据一致性。正确设计能够充分发挥MongoDB的优势,实现高效的数据管理。
40 3
|
1月前
|
NoSQL BI 数据处理
【超实用攻略】MongoDB 聚合框架:从入门到精通,带你解锁数据处理新姿势!
【8月更文挑战第24天】MongoDB是一款以其灵活性和高性能闻名的NoSQL数据库。其强大的聚合框架采用管道式处理,允许用户定义多个数据处理阶段如过滤、分组等。本文通过示例数据库`orders`和`products`,演示如何利用聚合框架计算各产品的总销售额。示例代码展示了使用`$lookup`连接两集合、`$unwind`打平数组及`$group`按产品ID分组并计算总销售额的过程。这突显了聚合框架处理复杂查询的强大能力,是进行数据分析和报表生成的理想选择。
29 3
|
1月前
|
存储 NoSQL JavaScript
MongoDB存储过程实战:聚合框架、脚本、最佳实践,一文全掌握!
【8月更文挑战第24天】MongoDB是一款备受欢迎的文档型NoSQL数据库,以灵活的数据模型和强大功能著称。尽管其存储过程支持不如传统关系型数据库,本文深入探讨了MongoDB在此方面的最佳实践。包括利用聚合框架处理复杂业务逻辑、封装业务逻辑提高复用性、运用JavaScript脚本实现类似存储过程的功能以及考虑集成其他工具提升数据处理能力。通过示例代码展示如何创建订单处理集合并定义验证规则,虽未直接实现存储过程,但有效地演示了如何借助JavaScript脚本处理业务逻辑,为开发者提供更多实用指导。
32 2
|
1月前
|
存储 NoSQL 数据处理
【MongoDB大神级操作】揭秘聚合框架,让你的数据处理能力瞬间飙升,秒变数据界的超级英雄!
【8月更文挑战第24天】MongoDB是一款备受欢迎的非关系型数据库,以其灵活的文档模型和出色的可扩展性著称。其聚合框架尤其亮眼,能高效地对数据库中的数据执行复杂的转换与聚合操作,无需将数据导出到应用端处理,极大提升了数据处理的效率与灵活性。例如,在一个大型电商数据库中,聚合框架能轻松分析出最热卖的商品或特定时段内某类别商品的销售总额。通过一系列管道操作,如$unwind、$group等,可以对数据进行逐步处理并得到最终结果,同时还支持过滤、排序、分页等多种操作,极大地丰富了数据处理的能力,成为进行数据分析、报表生成及复杂业务逻辑实现的强大工具。
31 2
|
1月前
|
存储 NoSQL MongoDB
【掌握MongoDB】轻松精通MongoDB查询,从基础到高级一网打尽!
【8月更文挑战第24天】在数据驱动的时代,数据库的性能与灵活性对企业至关重要。MongoDB作为一种高性能、无模式的文档数据库,为开发者提供了灵活的数据存储方案。尤其在处理半结构化或多变数据时展现出强大优势。本文重点介绍MongoDB中的查询操作,包括基本查询、条件查询、复杂查询以及字段选择、排序和限制等功能。通过掌握这些基本查询技巧,开发者能够有效从MongoDB中检索数据,支持复杂的业务逻辑。
49 1
|
1月前
|
监控 NoSQL MongoDB
mongodb查询100万数据如何查询快速
综上,提高MongoDB百万级数据的查询性能需要综合多项技术,并在实际应用中不断调优和实践。理解数据的特征,合理设计索引,优化查询语句,在数据访问、管理上遵循最佳的实践,这样才能有效地管理和查询大规模的数据集合。
115 1
|
26天前
|
持续交付 jenkins C#
“WPF与DevOps深度融合:从Jenkins配置到自动化部署全流程解析,助你实现持续集成与持续交付的无缝衔接”
【8月更文挑战第31天】本文详细介绍如何在Windows Presentation Foundation(WPF)项目中应用DevOps实践,实现自动化部署与持续集成。通过具体代码示例和步骤指导,介绍选择Jenkins作为CI/CD工具,结合Git进行源码管理,配置构建任务、触发器、环境、构建步骤、测试及部署等环节,显著提升开发效率和代码质量。
42 0