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
格式,Bson
是JSON
的一个升级版。语法和 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、sql
和mongodb
查询对比
注意
除非通过投影明确排除,否则该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
格式,Bson
是JSON
的一个升级版。语法和 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<