一、前言

mongodb 是由C++语言编写的一种开源的非关系型数据库(nosql)
nosql = Not Only SQL ,即:不仅仅是SQL。是一个面向文档存储的数据库,操作起来比较简单和容易。

mongodb 将数据存储为一个文档,数据结构由键值(key=>value)对组成。
mongodb 文档类似于 JSON 对象。字段值可以包含其他文档,数组及文档数组。
在这里插入图片描述
mongodb是非关系型数据库当中最像关系型数据库的。

1.1 mongodb与关系型数据库对比如下:

sqlmongodb解释说明
databasedatabase数据库
tablecollection数据库表/集合
rowdocument数据记录行/文档
columnfield数据字段/域
indexindex索引
primary keyprimary key主键,mongodb自动将_id字段设置为主键
table joins表连接,mongodb不支持

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

1.2 mongodb中的表达式介绍

格式符号描述文字描述
:(冒号)=等于
$lt<小于
$lte<=小于等于
$gt>大于
$gte>=大于等于
$ne!=不等于
$inin()包含
$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)更改

  • 第一个大括号封装以什么样的条件更改;
  • 第二个大括号封装将哪些字段更改成什么样的数据。
Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐