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

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<

相关推荐

  1. MySQL 查询语句大全

    2024-03-18 14:08:03       39 阅读
  2. MongoDB语言命令

    2024-03-18 14:08:03       21 阅读
  3. Mysql数据库——阻塞语句查询分析

    2024-03-18 14:08:03       18 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-03-18 14:08:03       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-03-18 14:08:03       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-03-18 14:08:03       19 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-03-18 14:08:03       20 阅读

热门阅读

  1. Redis删除

    2024-03-18 14:08:03       21 阅读
  2. 通信系统架构

    2024-03-18 14:08:03       22 阅读
  3. 【Linux】在 Linux 上使用 Zig 编译 PostgreSQL 源码

    2024-03-18 14:08:03       20 阅读
  4. Linux 环境变量深入解析

    2024-03-18 14:08:03       19 阅读
  5. 自然语言处理概念及发展

    2024-03-18 14:08:03       20 阅读
  6. Spring Boot简析

    2024-03-18 14:08:03       19 阅读
  7. js中的indexOf的与hasOwnProperty

    2024-03-18 14:08:03       19 阅读
  8. ERP术语

    ERP术语

    2024-03-18 14:08:03      17 阅读
  9. SpringSecurity解决路径中含有%2F的问题

    2024-03-18 14:08:03       18 阅读
  10. 【算法】KY3 约数的个数

    2024-03-18 14:08:03       21 阅读