首页 数据库 mysql教程 MongoDB的常用Query操作的介绍(附代码)

MongoDB的常用Query操作的介绍(附代码)

Mar 23, 2019 pm 04:39 PM
mongodb

本篇文章给大家带来的内容是关于MongoDB的常用Query操作的介绍(附代码),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。

前言:使用的可视化工具是 Studio 3T,官网-->https://studio3t.com/
版本号:MongoDB shell version v3.4.2
如何使用:https://blog.csdn.net/weixin_...
看点:重点看操作符那块。
如何查找:在此页面按 ctrl+F 输入关键字查找

一、常用Query
为方便操作,在插入原数据前,先删除所有文档(在项目中请谨慎操作!):

db.getCollection("inventory").deleteMany({})
登录后复制

0、查看所有文档

db.getCollection("inventory").find({})
登录后复制

1、对象查找
1.1、原数据

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" }
]);
登录后复制
登录后复制

1.2、查找 size.h 等于 14,size.w 等于 21,size.uom 等于 cm 的文档

db.inventory.find( { size: { h: 14, w: 21, uom: "cm" } } )
登录后复制

1.3、查找 size.uom 等于 in 的文档

db.inventory.find( { "size.uom": "in" } )
登录后复制

注意:当查找单个对象属性时,务必加上引号!

1.4、查找并返回对象里的指定字段

db.inventory.find(
   { status: "A" },
   { item: 1, status: 1, "size.uom": 1 }
)
登录后复制

1.5、查找并过滤对象里的指定字段

db.inventory.find(
   { status: "A" },
   { "size.uom": 0 }
)
登录后复制

2、数组查找
2.1、原数据

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 ] }
]);
登录后复制
登录后复制
登录后复制
登录后复制

2.2、查找 tags=["red", "blank"] 的文档

db.inventory.find( { tags: ["red", "blank"] } )
登录后复制

注意:不是包含关系,即 tags: ["red", "blank", "plain"] 是不包括在内的

2.3、查找 tags 包含 red 的文档

db.inventory.find( { tags: "red" } )
登录后复制

注意:不能这么写 db.inventory.find( { tags: ["red"] } ),这样就表示查找 tags 是 red 的文档

3、数组中包含对象的查找
3.1、原数据

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 } ] }
]);
登录后复制
登录后复制
登录后复制

3.2、查找数组中有一个对象符合条件的(不是包含),只要数组中有一个对象符合条件就返回整个数组

db.inventory.find( { "instock": { warehouse: "A", qty: 5 } } )
登录后复制

要严格按照字段的顺序来,如果调换字段顺序会 找 不 到,如下:

db.inventory.find( { "instock": { qty: 5, warehouse: "A" } } )
登录后复制

3.3、查找数组中的元素对象,有一个元素对象的qty=5,或者该对象(或者是其他元素对象)的warehouse=A

db.inventory.find( { "instock.qty": 5, "instock.warehouse": "A" } )
登录后复制

3.4、查找数组中的对象,并返回对象的某个属性

db.inventory.find( { status: "A" }, { item: 1, status: 1, "instock.qty": 1 } )
登录后复制

4、普通查找
4.1、原数据

db.inventory.insertMany( [
  { item: "journal", status: "A", size: { h: 14, w: 21, uom: "cm" }, instock: [ { warehouse: "A", qty: 5 } ] },
  { item: "notebook", status: "A",  size: { h: 8.5, w: 11, uom: "in" }, instock: [ { warehouse: "C", qty: 5 } ] },
  { item: "paper", status: "D", size: { h: 8.5, w: 11, uom: "in" }, instock: [ { warehouse: "A", qty: 60 } ] },
  { item: "planner", status: "D", size: { h: 22.85, w: 30, uom: "cm" }, instock: [ { warehouse: "A", qty: 40 } ] },
  { item: "postcard", status: "A", size: { h: 10, w: 15.25, uom: "cm" }, instock: [ { warehouse: "B", qty: 15 }, { warehouse: "C", qty: 35 } ] }
]);
登录后复制

4.2、查询并返回指定字段
在 status=A 的条件下,返回 _id,item,status 字段

db.inventory.find( { status: "A" }, { item: 1, status: 1 } )
登录后复制

结果:

{ "_id" : ObjectId("5c91cd53e98d5972748780e1"), 
    "item" : "journal", 
    "status" : "A"}
// ----------------------------------------------
{ "_id" : ObjectId("5c91cd53e98d5972748780e2"), 
    "item" : "notebook", 
    "status" : "A"}
// ----------------------------------------------
{ "_id" : ObjectId("5c91cd53e98d5972748780e5"), 
    "item" : "postcard", 
    "status" : "A"}
登录后复制

4.3、由 4.2 可知,_id 是自动带着的,可以去掉,如下
查询不带(去掉) id :

db.inventory.find( { status: "A" }, { item: 1, status: 1, _id: 0 } )
登录后复制

注意:除了 id 可以在过滤掉的同时,还去保留其他字段外,其他字段不能在 0 的同时,还写 1
如:

db.inventory.find( { status: "A" }, { item: 1, status: 0 } )
登录后复制

会报错

5518628-9f9c494930a74ccc.png

4.4、排除特定字段,返回其他字段

db.inventory.find( { status: "A" }, { status: 0, instock: 0 } )
登录后复制

5、查找 null 或不存在的 键
5.1、原数据

db.inventory.insertMany([
   { _id: 1, item: null },
   { _id: 2 }
])
登录后复制
登录后复制

5.2、查找 item 为 null 的文档,或者不包含 item 的文档

db.inventory.find( { item: null } )
登录后复制

二、操作符
1、$lt  less than 小于
1.1、原数据

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" }
]);
登录后复制
登录后复制

1.2、查找 "size.h" 小于 15 的文档集合

db.inventory.find( { "size.h": { $lt: 15 } } )
登录后复制

1.3、$lt 与 AND 联用
查找 size.h 小于 15,并且 size.uom 是 in ,并且 status 是 D 的文档

db.inventory.find( { "size.h": { $lt: 15 }, "size.uom": "in", status: "D" } )
登录后复制

2、$lte less than equal 小于等于
2.1、原数据

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 } ] }
]);
登录后复制
登录后复制
登录后复制

2.2、查找 instock.qty 小于等于 20 的文档,只要数组中有一个对象符合条件就返回整个数组

db.inventory.find( { 'instock.qty': { $lte: 20 } } )
登录后复制

3、$gt greater than 大于
3.1、原数据

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 ] }
]);
登录后复制
登录后复制
登录后复制
登录后复制

3.2、查找 dim_cm 大于 25 的文档

db.inventory.find( { dim_cm: { $gt: 25 } } )
登录后复制

注意:只要包含大于 25 的元素的数组,都是符合条件的

3.3、查找 dim_cm 大于 15,或小于 20,或既大于 15,又小于 20 的文档

db.inventory.find( { dim_cm: { $gt: 15, $lt: 20 } } )
登录后复制

3.4、查找 dim_cm 既大于 22,又小于 30 的文档(是判断数组的某一个元素是否是大于22,且小于30的,而不是判断数组的所有元素)

db.inventory.find( { dim_cm: { $elemMatch: { $gt: 22, $lt: 30 } } } )
登录后复制

3.5、根据数组位置查找
查找 dim_cm 的第二个元素 大于 25 的文档

db.inventory.find( { "dim_cm.1": { $gt: 25 } } )
登录后复制

4、$size 根据数组长度查找
查找 tags 长度是 3 的文档

db.inventory.find( { "tags": { $size: 3 } } )
登录后复制

5、$gte 大于等于
5.1、原数据

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 } ] }
]);
登录后复制
登录后复制
登录后复制

5.2、查找数组的第一个元素(对象)的qty 大于等于 20 的文档集合

db.inventory.find( { 'instock.0.qty': { $gte: 20 } } )
登录后复制

6、$elemMatch 对象的属性匹配
6.1、在数组中查找符合 qty=5, warehouse="A" 的对象,并返回该文档集合

db.inventory.find( { "instock": { $elemMatch: { qty: 5, warehouse: "A" } } } )
登录后复制

6.2、在数组中查找符合 qty 大于 10 并且小于等于 20 的文档集合

db.inventory.find( { "instock": { $elemMatch: { qty: { $gt: 10, $lte: 20 } } } } )
登录后复制

如果不使用 $elemMatch 的话,就表示 qty 大于 10 或者小于等于 20,官方文档意思是,不在数组的某一个元素找 既满足条件 A 又满足条件 B 的 qty,而是在数组的所有元素上找,满足条件 A 或满足条件 B 的 qty

db.inventory.find( { "instock.qty": { $gt: 10,  $lte: 20 } } )
登录后复制

7、$slice 返回数组特定位置的元素
7.1、原数据

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 ] }
]);
登录后复制
登录后复制
登录后复制
登录后复制

7.2、查找并返回 tags 数组的最后一个元素

db.inventory.find( { item: "journal" }, { item: 1, qty: 0, tags: { $slice: -1 } } )
登录后复制

结果:

{ 
    "_id" : ObjectId("5c91dce5e98d5972748780e6"), 
    "item" : "journal", 
    "tags" : [
        "red"
    ]
}
登录后复制

8、$type 返回指定类型的元素
8.1、原数据

db.inventory.insertMany([
   { _id: 1, item: null },
   { _id: 2 }
])
登录后复制
登录后复制

8.2、返回 null 类型的数据

db.inventory.find( { item : { $type: 10 } } )
登录后复制

类型如下:

5518628-977fce936fee345b.png

详细文档请看:https://docs.mongodb.com/manu...

9、$exists 返回存在/不存在的键
查找不存在 item 键的数据

db.inventory.find( { item : { $exists: false } } )
登录后复制

10、$all 包含
10.1、原数据

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 ] }
]);
登录后复制
登录后复制
登录后复制
登录后复制

10.2、查找 tags 数组包含 ["red", "blank"] 的文档

db.inventory.find( { tags: { $all: ["red", "blank"] } } )
登录后复制

综上:
数组用的:$all$size$slice
对象用的:$elemMatch

Query查询的详细文档请看:https://docs.mongodb.com/manu...
Operator的详细文档请看:https://docs.mongodb.com/manu...

本篇文章到这里就已经全部结束了,更多其他精彩内容可以关注PHP中文网的mongodb视频教程栏目!

以上是MongoDB的常用Query操作的介绍(附代码)的详细内容。更多信息请关注PHP中文网其他相关文章!

本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

AI Hentai Generator

AI Hentai Generator

免费生成ai无尽的。

热门文章

R.E.P.O.能量晶体解释及其做什么(黄色晶体)
1 个月前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳图形设置
1 个月前 By 尊渡假赌尊渡假赌尊渡假赌
威尔R.E.P.O.有交叉游戏吗?
1 个月前 By 尊渡假赌尊渡假赌尊渡假赌

热工具

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

navicat怎么连mongodb navicat怎么连mongodb Apr 24, 2024 am 11:27 AM

要使用 Navicat 连接 MongoDB,您需要:安装 Navicat创建 MongoDB 连接:a. 输入连接名称、主机地址和端口b. 输入认证信息(如果需要)添加 SSL 证书(如果需要)验证连接保存连接

net4.0有什么用 net4.0有什么用 May 10, 2024 am 01:09 AM

.NET 4.0 用于创建各种应用程序,它为应用程序开发人员提供了丰富的功能,包括:面向对象编程、灵活性、强大的架构、云计算集成、性能优化、广泛的库、安全性、可扩展性、数据访问和移动开发支持。

无服务器架构中Java函数与数据库的集成 无服务器架构中Java函数与数据库的集成 Apr 28, 2024 am 08:57 AM

在无服务器架构中,Java函数可以与数据库集成,以访问和操作数据库中的数据。关键步骤包括:创建Java函数、配置环境变量、部署函数和测试函数。通过遵循这些步骤,开发人员可以构建复杂的应用程序,无缝访问存储在数据库中的数据。

如何在Debian上配置MongoDB自动扩容 如何在Debian上配置MongoDB自动扩容 Apr 02, 2025 am 07:36 AM

本文介绍如何在Debian系统上配置MongoDB实现自动扩容,主要步骤包括MongoDB副本集的设置和磁盘空间监控。一、MongoDB安装首先,确保已在Debian系统上安装MongoDB。使用以下命令安装:sudoaptupdatesudoaptinstall-ymongodb-org二、配置MongoDB副本集MongoDB副本集确保高可用性和数据冗余,是实现自动扩容的基础。启动MongoDB服务:sudosystemctlstartmongodsudosys

MongoDB在Debian上的高可用性如何保障 MongoDB在Debian上的高可用性如何保障 Apr 02, 2025 am 07:21 AM

本文介绍如何在Debian系统上构建高可用性的MongoDB数据库。我们将探讨多种方法,确保数据安全和服务持续运行。关键策略:副本集(ReplicaSet):利用副本集实现数据冗余和自动故障转移。当主节点出现故障时,副本集会自动选举新的主节点,保证服务的持续可用性。数据备份与恢复:定期使用mongodump命令进行数据库备份,并制定有效的恢复策略,以应对数据丢失风险。监控与报警:部署监控工具(如Prometheus、Grafana)实时监控MongoDB的运行状态,并

navicat能连接mongodb吗 navicat能连接mongodb吗 Apr 23, 2024 pm 05:15 PM

是的,Navicat 可以连接到 MongoDB 数据库。具体步骤包括:打开 Navicat 并创建新的连接。选择数据库类型为 MongoDB。输入 MongoDB 主机地址、端口和数据库名称。输入 MongoDB 用户名和密码(如果需要)。单击“连接”按钮。

Navicat查看MongoDB数据库密码的方法 Navicat查看MongoDB数据库密码的方法 Apr 08, 2025 pm 09:39 PM

直接通过 Navicat 查看 MongoDB 密码是不可能的,因为它以哈希值形式存储。取回丢失密码的方法:1. 重置密码;2. 检查配置文件(可能包含哈希值);3. 检查代码(可能硬编码密码)。

Pi币重大更新:Pi Bank要来了! Pi币重大更新:Pi Bank要来了! Mar 03, 2025 pm 06:18 PM

PiNetwork即将推出革命性移动银行平台PiBank!PiNetwork今日发布重大更新Elmahrosa(Face)PIMISRBank,简称PiBank,它将传统银行服务与PiNetwork加密货币功能完美融合,实现法币与加密货币的原子交换(支持美元、欧元、印尼盾等法币与PiCoin、USDT、USDC等加密货币的互换)。究竟PiBank有何魅力?让我们一探究竟!PiBank主要功能:一站式管理银行账户和加密货币资产。支持实时交易,并采用生物特

See all articles