一、前言
mongodb
是由C++语言编写的一种开源的非关系型数据库(nosql)
。
nosql = Not Only SQL
,即:不仅仅是SQL。是一个面向文档存储的数据库,操作起来比较简单和容易。
mongodb
将数据存储为一个文档,数据结构由键值(key=>value)对组成。
mongodb
文档类似于 JSON 对象。字段值可以包含其他文档,数组及文档数组。
mongodb是非关系型数据库当中最像关系型数据库的。
1.1 mongodb与关系型数据库对比如下:
sql | mongodb | 解释说明 |
---|---|---|
database | database | 数据库 |
table | collection | 数据库表/集合 |
row | document | 数据记录行/文档 |
column | field | 数据字段/域 |
index | index | 索引 |
primary key | primary key | 主键,mongodb自动将_id字段设置为主键 |
table joins | 表连接,mongodb不支持 |
所以更改数据的时候需要注意,有可能我们更改的那个数据字段压根就不存在。所以在更改领域会出现一个方法叫做更改不存在就添加,然后返回编号 _id
。
1.2 mongodb中的表达式介绍
格式 | 符号描述 | 文字描述 |
---|---|---|
:(冒号) | = | 等于 |
$lt | < | 小于 |
$lte | <= | 小于等于 |
$gt | > | 大于 |
$gte | >= | 大于等于 |
$ne | != | 不等于 |
$in | in() | 包含 |
$nin | 不包含 |
二、sql语句和mongodb语句对比
2.1 创建表和插入数据
(1)sql
create table people (
id mediumint not null,
user_id varchar(30),
age number,
status char(1),
primary key (id)
) //创建表
insert into people(user_id,age,status) values ("bcd001",45,'a'); //插入数据
(2)mongodb
mongodb 不需要创建表,在插入数据的时如果指定的文档没有,那么会自动创建一个相应的文档,并保存。但也可以显示的创建一个文旦同时向里面插入数据。
语法:db.文档名.create();
db.people.insertOne({
user_id: "abc123",
age: 55,
status: "A"
}); // 创建表
db.people.create({'user_id':'zhangsan','age':18,'status':'A'}); //插入数据
2.2 查询对比
(1)mysql 查询
select * from people; //查询所有
select id,user_id,age from people; //返回指定字段
select user_id,age from people; //不显示id
select * from people where status = "A"; //查询status:"A"的所有
select id,user_id,age from people where status = "A"; //并返回指定的字段
select * from people where status != "A"; //查询status!= "A"的所有
select * from people where status = "A" and age = 55; //status="A" and age=50
select * from people where status = "A" or age = 55; //status="A" or age=50
select * from people where age > 25; //age>25
select * from people where age < 25; //age<25
select * from people where age > 25 and <= 50; //age>25 and age<=50
select * from people where user_id like '%bc%'; //模糊查询
select * from people where user_id like 'bc%'; //模糊查询
(2)mongodb
查询
语法:db.文档名.find();
db.people.find(); //查询所有
db.people.find({},{ user_id: 1, status: 1 }); //返回指定字段
db.people.find({},{ _id: 0, user_id: 1, status: 1 }); //不显示id
db.people.find({ status: "A" }); //查询status:"A"的所有
db.people.find({ status: "A" },{ _id: 0, user_id: 1, status: 1 }); //并返回指定的字段
db.people.find({ status: { $ne: "A" } });//查询status!= "A"的所有
db.people.find({ status: "A" ,age: 55}); //status="A" and age=50
db.people.find({ $or:[{ status: "A" ,age: 55}] }); //status="A" or age=50
db.people.find({ age: { $gt: 25 } }); //age>25
db.people.find({ age: { $lt: 25 } }); //age<25
db.people.find({ age: { $gt: 25, $lte: 50 } }); //age>25 and age<=50
db.people.find({ user_id: /bc/ });//模糊查询
db.people.find({ user_id: { $regex: /bc/ } });//模糊查询
db.people.find({ user_id: /^bc/ });//模糊查询
db.people.find({ user_id: { $regex: /^bc/ } });//模糊查询
注意:第一个{},
不能去掉,表示筛选条件,例如sql
中的where
。后面大括号中的字段表示是否显示,如果为1
显示,如果为0
不显示。_id
是默认显示的。
2.3 排序对比
(1)sql 排序
select * from people where status = 'A' order by user_id ASC; //ASC升序
select * from people where status = 'A' order by user_id ASC; //DESC降序
(2)mongodb
排序
db.people.find( { status: "A" } ).sort( { user_id: 1 } );//1升序
db.people.find( { status: "A" } ).sort( { user_id: -1 } );//-1降序
注意:排序的时候,sort()
方法是在 find()方法之外了。最后面这个1
表示升序排序,-1
表示降序排序。
2.4 统计总数
(1)sql 统计总数
select count(*) from people;
select count(user_id) from people; //指定字段统计总数
(2)mongodb
统计总数
db.people.count()
db.people.find().count()
db.people.count( { user_id: { $exists: true } } )//指定字段统计总数
db.people.find( { user_id: { $exists: true } } ).count()
2.5 去重
(1)sql 去重
select distinct(status) from people;
(2)mongodb
去重
db.people.aggregate( [ { $group : { _id : "$status" } } ] )
db.people.distinct( "status" )
2.6 获取指定条数
(1)sql
select * from people limit 1;
select * from people limit 5,10; //从索引为5获取10条数据
(2)mongodb
db.people.findOne(); //findOne每次只能获取一条数据
db.people.find().limit(1); //limit可获取指定条数
db.people.find().limit(5).skip(10); //从索引为5获取10条数据
2.7 更改(修改)
(1)sql update
update people SET status = 'D'; //更改全部 status: "D"
update people SET age = 20 where status = 'C'; //将status: "C"的年龄更改为 20岁
(2)mongodb
db.people.upadateMany({},{ $set:{ status:'D' }}); //更改全部 status: "D"
db.people.upadateMany({ status: "C" },{ $set:{ status:'D' }}); //将status: "C"的年龄更改为 20岁
总结
无论是查询还是更改删除,第一个个大括号都封装为条件,第二个大括号在做相应的操作。
(1)查询
- 第一个大括号封装以什么样作为条件查询;
- 第二个大括号封装查询结果返回哪些字段。
(2)更改
- 第一个大括号封装以什么样的条件更改;
- 第二个大括号封装将哪些字段更改成什么样的数据。