mongodb查询大全mongo语句-MongoDB语句与MySQL语句对比

news2025/2/26 23:00:03

mongodb查询大全mongo语句

  • 以前版本

官网:https://www.mongodb.com/

在这里插入图片描述

  • 现在版本2021年12月7日

官网:https://www.mongodb.com

直通车:https://docs.mongodb.com

在这里插入图片描述

在这里插入图片描述

一、前言

虽然这些语句在开发当中不会使用,因为springdataMongoDB封装的非常完美了。但是这里的语句思想和关系型数据库有些区别,所以需要拿出来详细的讲解一下。因为原生的语句没有搞明白,后面使用springdataMongoDB拼接条件查询的时候心里没数,不知道该怎么去写。现在大多数教程讲的非常详细,分初级和高级,但是即使是高级,有很多经常使用到的语句依然没有讲到,这里还是很有必要去总结一下。

mongodb是非关系型数据库,也就是nosql。在使用起来是非常方便的,例如:在某个实体类中需要添加一个列,这样直接在实体类中添加就OK,不会影响mongodb的,如果你添加一个列了,然后保存数据的时候,这个类存在数据,那么就以java中保存这个集合的样子存入mongodb中。所以在关系型数据库中说的表在mongodb中不说表,说集合。

MongoDB是非关系型数据库当中最像关系型数据库的,所以我们通过它与关系型数据库的对比,来了解下它的概念。

SQL概念 MongoDB概念 解释/说明
database database 数据库
table collection 数据库表/集合
row document 数据记录行/文档
column field 数据字段/域
index index 索引
primary key primary key 主键,MongoDB自动将_id字段设置为主键

所以更改数据的时候需要注意,有可能我们更改的那个数据字段压根就不存在。所以在更改领域会出现一个方法叫做更改不存在就添加,然后返回编号 _id

注意:在非关系型数据库中是没有连表查询这种概念的,但是可以在集合中嵌套集合查询。因为我们在关系型数据库中的连表查询,最终的数据都是保存在集中。我们怎么保存在集合中,那么我们就以保存的这种方式直接存入mongodb就OK,但是mongodb还支持集合中嵌套集合的查询,可以给嵌套的那个集合添加条件筛选。

当前演示的mongodb版本为 4.4 (这个就要注意一下,之前的版本或许有些操作不支持,之后也有不支持的情况,如果废气了呢???)。

观看关系型查询语句和mongodb的语句对比,可以查看官方文档:https://docs.mongodb.com/master/reference/sql-comparison/

mongodb使用的是 Bson格式,BsonJSON的一个升级版。语法和 JSON都差不多。所以在书写的时候,不管条件怎么写一定都是一个JSON格式的。这里第一个第括号是封装条件,那么条件之间使用 or连接,or里面可能有多个数据,那么又用了一个数组来存储,数组中又是一个一个的对象。从而就形成了 { $or: [ { status: "A" } , { age: 50 } ] }这样的格式。

mongodb中的表达式介绍

格式 符号描述 文字描述
(冒号) = 等于
$lt < 小于
$lte <= 小于等于
$gt > 大于
$gte >= 大于等于
$ne != 不等于
$in in() 包含
$nin 不包含

二、sql语句和mongodb语句对比

2.1、创建表并插入数据

  • sql创建表
create table people (
    id mediumint not null
        auto_increment,
    user_id varchar(30),
    age number,
    status char(1),
    primary key (id)
)
  • mongodb创建表

mongodb不用创建表,如果你插入的数据指定的文档没有,那么会自动创建一个相应的文档,并保存。但是也可以显示的创建一个文档然后在向里面插入数据的。

db.people.insertOne( {
   
    user_id: "abc123",
    age: 55,
    status: "A"
 } )
  • sql的方式
insert into people(user_id,age,status) values ("bcd001",45,"a")
  • mongodb方式

2.2、sqlmongodb查询对比

注意

除非通过投影明确排除,否则该find()方法始终将_id字段包含在返回的文档中 。即使某些字段不包含在相应的查询中,下面的某些SQL查询也可能包含一个 反映该问题的字段。_id find()

投影:就只返回指定的字段。如果没有用投影查询,所有查询的语句都相当于sql语句中的 select * from 表名这样的语句。

目前的mongodb和MySQL

MYSQL mongodb

查询所有

  • mysql
select * from people;
  • mongodb

语法:db.文档名.find();

db.people.find();

返回指定字段

select id,user_id,status from people
 db.people.find(
    {
   },
    {
    user_id: 1, status: 1 }
)

注意:第一个 {},不能去掉,表示筛选条件,例如sql中的where。后面这个大括号中的字段表示是否显示,如果为 1显示,0不显示。但是 _id默认是显示的。

在这里插入图片描述


不显示编号 _id

SELECT user_id, status
FROM people
db.people.find(
    {
    },
    {
    user_id: 1, status: 1, _id: 0 }
)

在这里插入图片描述

status: "A"的所有

SELECT *
FROM people
WHERE status = "A"
db.people.find(
    {
    status: "A" }
)

在这里插入图片描述

status: "A"并返回指定字段

SELECT user_id, status
FROM people
WHERE status = "A"
db.people.find(
    {
    status: "A" },
    {
    user_id: 1, status: 1, _id: 0 }
)

在这里插入图片描述

status != "A"返回所有字段

SELECT *
FROM people
WHERE status != "A"
db.people.find(
    {
    status: {
    $ne: "A" } }
)

在这里插入图片描述

status = “A” and age =55 返回所有字段

SELECT *
FROM people
WHERE status = "A"
AND age = 55
db.people.find(
    {
    status: "A",
      age: 55 }
)

在这里插入图片描述

status = “A” or age = 50 返回所有字段

SELECT *
FROM people
WHERE status = "A"
OR age = 50
db.people.find(
    {
    $or: [ {
    status: "A" } , {
    age: 50 } ] }
)

注意:mongodb使用的是 Bson格式,BsonJSON的一个升级版。语法和 JSON都差不多。所以在书写的时候,不管条件怎么写一定都是一个JSON格式的。

这里第一个第括号是封装条件,那么条件之间使用 or连接,or里面可能有多个数据,那么又用了一个数组来存储,数组中又是一个一个的对象。从而就形成了 { $or: [ { status: "A" } , { age: 50 } ] }这样的格式。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

age > 25 返回所有字段

SELECT *
FROM people
WHERE age > 25
db.people.find(
    {
    age: {
    $gt: 25 } }
)

age < 25 返回所有字段

SELECT *
FROM people
WHERE age < 25
db.people.find(
   {
    age: {
    $lt: 25 } }
)

age > 25 AND age <= 50

SELECT *
FROM people
WHERE age > 25
AND   age <= 50
db.people.find(
   {
    age: {
    $gt: 25, $lte: 50 } }
)

其他

SELECT *
FROM people
WHERE user_id like "%bc%"
db.people.find( {
    user_id: /bc/ } )
db.people.find( {
    user_id: {
    $regex: /bc/ } } )

SELECT *
FROM people
WHERE user_id like "bc%"
db.people.find( {
    user_id: /^bc/ } )
或者
db.people.find( {
    user_id: {
    $regex: /^bc/ } } )

  • 根据user_id升序排序,并且status = "A"
SELECT *
FROM people
WHERE status = "A"
ORDER BY user_id ASC
db.people.find( {
    status: "A" } ).sort( {
    user_id: 1 } )

注意:排序的时候,sort()方法是在 find()方法之外了。最后面这个1表示升序排序,-1表示降序排序。


SELECT *
FROM people
WHERE status = "A"
ORDER BY user_id DESC
db.people.find( {
    status: "A" } ).sort( {
    user_id: -1 } )

  • 查询总数
SELECT COUNT(*)
FROM people
db.people.count()
或者
db.people.find().count()

  • 指定字段查询总数
SELECT COUNT(user_id)
FROM people
db.people.count( {
    user_id: {
    $exists: true } } )
或者
db.people.find( {
    user_id: {
    $exists: true } } ).count()

SELECT COUNT(*)
FROM people
WHERE age > 30
db.people.count( {
    age: {
    $gt: 30 } } )
或者
db.people.find( {
    age: {
    $gt: 30 } } ).count()

  • 去重复,非常有用

例如:访问量人数,访问一次记录一次。那么我想统计访问过我的人,而不是访问量,这时就派的上用场了。

SELECT DISTINCT(status)
FROM people
db.people.aggregate( [ {
    $group : {
    _id : "$status" } } ] )
或者
db.people.distinct( "status" )

  • 获取指定条数
SELECT *
FROM people
LIMIT 1
db.people.findOne()
或者
db.people.find().limit(1)

findOne() 每次只能获取一条数据,如果我想获取2条3条呢?这时就需要使用下面这个语句了。


  • 从索引为5获取10条数据
SELECT *
FROM people
LIMIT 5,10
db.people.find().limit(5).skip(10)

  • 查看sql执行情况
EXPLAIN SELECT *
FROM people
WHERE status = "A"
db.people.find( {
    status: "A" } ).explain()

详细查看该博客:https://www.cnblogs.com/tufujie/p/9413852.html

查询参数讲解:

id:选择标识符
select_type:表示查询的类型。
table:输出结果集的表
partitions:匹配的分区
type:表示表的连接类型
possible_keys:表示查询时,可能使用的索引
key:表示实际使用的索引
key_len:索引字段的长度
ref:列与索引的比较
rows:扫描出的行数(估算的行数)
filtered:按表条件过滤的行百分比
Extra:执行情况的描述和说明

三、mongodb语句风格说明

3.1、首先观察几个查询语句和更改语句

  • 查询 status: "A"所有数据
select * from people where status: "A"
db.people.find(
    {
    status: "A" }
)
  • 查询 status: "A",返回 user_id,status字段。
select user_id,status from people where status: "A"
db.people.find(
    {
    status<

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1524143.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

惯导系统静止初始化方法与代码实现并在gazebo中测试

惯导系统静止初始化方法与代码实现并在gazebo中测试 前言静止初始化方法惯导静止初始化实现代码在gazebo中进行测试 前言 在进行GPS加IMU的组合导航或者Lidar加IMU的组合导航时&#xff0c;用EKF或者ESKF的滤波方法时&#xff0c;需要提前知道惯导的测量噪声、初始零偏、重力方…

Mysql 索引、锁与MVCC等相关知识点

文章目录 Mysql锁的类型锁使用MVCC快照读和当前读读视图【Read View】串行化的解决 索引类型存储方式区分逻辑区分实际使用区分索引失效情况 索引建立规范SQL编写规范exlpain字段解析ACID的原理日志引擎慢SQL整合SpringBoot博客记录 Mysql锁的类型 MySQL中有哪些锁&#xff1a…

机器学习——压缩网络作业

文章目录 任务描述介绍知识蒸馏网络设计 Baseline实践 任务描述 网络压缩&#xff1a;使用小模型模拟大模型的预测/准确性。在这个任务中&#xff0c;需要训练一个非常小的模型来完成HW3&#xff0c;即在food-11数据集上进行分类。 介绍 有许多种网络/模型压缩的类型&#xff0…

如何写好Stable Diffusion的prompt

Stable Diffusion是一种强大的文本到图像生成模型&#xff0c;其效果在很大程度上取决于输入的提示词&#xff08;Prompt&#xff09;。以下是一些关于如何编写有效的Stable Diffusion Prompt的秘诀&#xff1a; 明确描述&#xff1a;尽量清晰地描述你想要的图像内容。使用具体…

3.4 bp,si,di寄存器,寻址方式,寄存器总结

汇编语言 1. [bxidata] 我们可以用[bx]来指明一个内存单元我们也可以用[bxidata]来表示一个内存单元&#xff0c;它的偏移地址为bx中的数值加上idata mount c d:masm c: debug r d 2000:1000 e 2000:1000 12 34 56 78 a mov ax,2000 mov ds,ax mov bx,1000 mov ax,[bx] mov c…

训练YOLOv8m时AMP显示v8n

在训练Yolov8模型时&#xff0c;使用AMP&#xff08;Automatic Mixed Precision&#xff09;可以加速训练过程并减少显存的使用。AMP是一种混合精度训练技术&#xff0c;它通过将模型参数的计算转换为低精度&#xff08;如半精度&#xff09;来提高训练速度&#xff0c;同时保持…

llama笔记:官方示例解析 example_chat_completion.py

1 导入库 from typing import List, Optional从typing模块中导入List和Optional。typing模块用于提供类型注解的支持&#xff0c;以帮助明确函数预期接收和返回的数据类型。List用于指定列表类型Optional用于指定一个变量可能是某个类型&#xff0c;也可能是None。 import fir…

Visual Studio 2022下配置 OpenMP 多线程编程环境与运行

目录 一创建项目时选择“创建新项目 -> 空项目 -> 下一步 -> 创建” 二右键“源文件 -> 添加 -> 新建项 -> 添加” 三配置 1. 测试程序&#xff1a; 最开始的时候错误很多&#xff1a; 2.将 “ include "stdafx.h" ” 删掉&#xff0c;添加 “…

4.1_6 文件的基本操作

文章目录 4.1_6 文件的基本操作&#xff08;一&#xff09;创建文件&#xff08;二&#xff09;删除文件&#xff08;三&#xff09;打开文件&#xff08;四&#xff09;关闭文件&#xff08;五&#xff09;读文件&#xff08;六&#xff09;写文件 总结 4.1_6 文件的基本操作 …

uni-app开发特点和开发流程

uni-app是一个基于Vue.js框架的跨平台应用开发框架&#xff0c;通过一套代码可以同时运行在多个平台上&#xff0c;包括iOS、Android、H5等。它采用了基于流布局的页面渲染机制&#xff0c;可以自动适配不同平台的屏幕尺寸和分辨率。uniapp官网&#xff1a;https://uniapp.dclo…

2024-03-17悠然-思源茶社申时茶会有感

悠悠白云里&#xff0c;独住青山客&#xff1b; 然灯松林静&#xff0c;煮茗柴门香&#xff1b; 思归若汾水&#xff0c;无日不悠悠&#xff1b; 源上花初发&#xff0c;公应日日来&#xff1b; 申章写深谊&#xff0c;唯愿长相聚&#xff1b; 时时思己过&#xff0c;刻刻…

图鸟UI发布免费开源、高颜值小程序UI框架

大家好&#xff0c;今天分享的主题是图表统计。图表统计是使用图表和图形来可视化和呈现数据的方法。它通过将数据转化为柱状图、折线图、饼图等形式来展示各种统计指标和趋势。 图表统计可以帮助我们更好地理解和分析数据&#xff0c;发现数据之间的关联和规律&#xff0c;并…

四、自然语言中的生成式任务

目录 4.0 机器翻译 4.1 文本摘要 4.1.1 抽取式摘要 4.2.2 生成式摘要 NLP学习笔记系列&#xff0c;欢迎收藏交流&#xff1a; 零、自然语言处理开篇-CSDN博客 一、NLP中的文本分类-CSDN博客 二、NLP中的序列标注&#xff08;分词、主体识别&#xff09;-CSDN博客 三、NL…

基于单片机的IC 卡门禁系统设计

摘要:针对传统门锁钥匙易丢失、配置不便和忘记携带等问题,提出了一种基于STC89C52 的IC 卡门禁系统设计。该系统以STC89C52 单片机为核心来控制电子锁模块的开关。主要过程是由RFID 模块读取IC卡ID 并通过串口发送至STC89C52 单片机模块,STC89C52 单片机模块可以实现在线对I…

使用广度优先搜索算法找到最短路径,然后绘制路径图

使用广度优先搜索算法找到最短路径&#xff0c;然后绘制路径图 from collections import deque import matplotlib.pyplot as plt# 定义网格环境的参数 GRID_SIZE 5 GRID_WIDTH 4 AGENT_SPEED 2 START_STATE (0, 0) GOAL_STATE (GRID_SIZE - 1, GRID_SIZE - 1)# 定义动作…

Excel小技巧 (4) - Sumif用法

学期末&#xff0c;根据以下表格如果要汇总学生的三门主课分数&#xff0c;如何能快速的汇总呢&#xff1f; sumif就是一个很好用的函数 SUMIF&#xff08;指定汇总的key范围&#xff0c;汇总值&#xff0c;合计范围&#xff09;

记录windiwos系统安装homestead环境的一次报错

相关软件版本 VirtualBox 7.0.14Vagrant 2.3.8 报错信息如下 Bringing machine homestead up with virtualbox provider... > homestead: Box lc/homestead could not be found. Attempting to find and install...homestead: Box Provider: virtualboxhomestead: Box Ve…

从电影《沙丘》说起——对人工智能的思考

从《沙丘》开始说起 之前看《沙丘》电影&#xff0c;里面有一类角色叫门泰特&#xff0c;这类人大脑可以飞快地运算&#xff0c;在电影设定里是替换人工智能、机器运算的存在。男主保罗也是这类型的人&#xff0c;但他可能基因更强大&#xff0c;吸食了香料后&#xff0c;他的…

力扣题目训练(22)

2024年2月15日力扣题目训练 2024年2月15日力扣题目训练563. 二叉树的坡度637. 二叉树的层平均值643. 子数组最大平均数 I304. 二维区域和检索 - 矩阵不可变154. 寻找旋转排序数组中的最小值 II 2024年2月15日力扣题目训练 2024年2月15日第二十二天编程训练&#xff0c;今天主要…

Qt for Mac阻止MacOS系统休眠

Qt开发的应用程序如果电脑休眠了会影响软件的使用&#xff0c;因此在软件的使用过程中需要防止电脑休眠&#xff0c;在Win上有专门的API进行处理&#xff0c;在Mac上也必需使用Mac平台自身的API&#xff0c;本篇介绍在Mac平台下使用Qt阻止Mac系统休眠。 要调用Mac系统的API&am…