表结构对比 | MongoDB | Mysql |
---|
表 | collections | tables |
行 | documents | rows |
主键 | _id | id 与业务无关的值作为主键 |
约束 | 无 | 主键约束,外键约束 |
| mysql | MongoDB |
---|
进去库 | use dbname | use dbname |
显示表列表 | show tables | show collections |
查询主从状态 | show slave status | rs.status |
创建库 | create database name | 无需单独创建,直接use进去 |
创建表 | create table tname(id int) | 无需单独创建,直接插入数据 |
删除表 | drop table tname | db.tname.drop() |
删除库 | drop database dbname | 首先进去该库,db.dropDatabase() |
插入记录 | insert into tname(id) value(2) | db.tname.insert({id:2}) |
删除记录 | delete from tname where id=2 | db.tname.remove({id:2}) |
修改/更新记录 | update tname set id=3 where id=2; | db.tname.update({id:2}, {$set:{id:3}},false,true) |
查询所有记录 | select * from tname; | db.tname.find() |
查询所有列 | select id from tname; | db.tname.find({},{id:1}) |
条件查询 | select * from tname where id=2; | db.tname.find({id:2}) |
条件查询 | select * from tname where id < 2; | db.tname.find({id:{$lt:2}}) |
条件查询 | select * from tname where id >=2; | db.tname.find({id:{$gte:2}}) |
条件查询 | select * from tname where id=2 and name=‘steve’; | db.tname.find({id:2, name:‘steve’}) |
条件查询 | select * from tname where id=2 or name=‘steve’; | db.tname.find($or:[{id:2},{name:‘steve’}]) |
条件查询 | select * from tname limit 1; | db.tname.findOne() |
模糊查询 | select * from tname where name like “%ste%”; | db.tname.find({name:/ste/}) |
模糊查询 | select * from tname where name like “ste%”; | db.tname.find({name:/^ste/}) |
获取表记录数 | select count(id) from tname; | db.tname.count() |
获取有条件的记录数 | select count(id) from tname where id=2; | db.tname.find({id:2}).count() |
查询时去掉重复值 | select distinct(last_name) from tname; | db.tname.distinct(‘last_name’) |
正排序查询 | select * from tname order by id; | db.tname.find().sort({id:1}) |
逆排序查询 | select * from tname order by id desc; | db.tname.find().sort({id:-1}) |
特别要注意的是:mongodb插入多个字段语法
db.user.insert({id:1,name:‘steve’,sex:‘male’}) 正确
db.user.insert({id:2},{name:‘bear’},{sex:‘female’}) 错误
查询
- findOne()
- 不是查找一条语句,而是查找集合中符合条件的第一个文档
- findOne()的One首字母一定要大写
- 返回的是一个对象
- e.g: db.stu.findOne().name
- find():返回的是一个数组
- ;e.g: db.stu.find().[index].name 可以索引
- find({})空对象 / find()不写参数,也可以查找数据
- find.count()
更新修改
- db.collection.update(查询条件,新对象)
、
- 默认情况下会用新对象替换就对象 即:
“name” : “aaa”,
“age” : “19”,
“gender” : “nan”
执行db.stu.update({name:“aaa”},{age:“91”})
结果:“age” : “91”
- 使用修改操作符来修改指定的属性,而不是替换
KaTeX parse error: Expected 'EOF', got '&' at position 16: set==:用来修改<br> &̲emsp;e.g:db.stu…set:{
name:“ccc”,
gender:“nan”
}}
)注意:花括号有几个
$unset==:用来删除文档指定属性
- update()默认情况下只会修改一条数据,若要修改多条数据,可以使用updateMany()
删除
- db.collections.remove()
删除一条或多条语句,若删除多条语句,则第二个参数为true。
注意:remove()不写参数会报错 remove({})会清空集合
- 若真的需要清空集合,则选db.conllections.drop() remove({})性能较差 需要一个个去匹配
-一般公司不会真的使用drop()去删除数据库,而是添加一个字段 [Isdel:0] 未删除
- 一般创建集合时,选择复数,即:tests
- 内嵌文档:文档里面插入文档
-MongoDB支持通过内嵌文档的属性进行查询,如果要查询内嵌文档则可以通过.的形式来匹配
- 如果要通过内嵌文档来对文档进行查询,此时属性名必须使用引号 单双引号都可以
- 正确:db.collections.find({“hobby.movies”:“hero”});
- 错误:db.collections.find({hobby.movies:“hero”});
-若内嵌文档是数组的形式,如{“name”:“aa”,“hobby”:{“movies”:[“sanguo”,“hero”]}} 若要往里添加数据,则不能使用$set,因为数组会被覆盖
- $push 用于向数组中添加一个新元素
- db.collections.update({name:“aa”},{$push:{hobby.movies:“hhhh”}})
- $addToSet 也可以向数组中添加一个元素
- 区别 :
p
u
s
h
不
会
考
虑
数
据
重
复
性
的
问
题
,
而
push不会考虑数据重复性的问题,而
push不会考虑数据重复性的问题,而addToSet则不会重复添加已存在的数据
- 插入N条数据:
- for(var i=1;i<20000;i++) db.numbers.insert({num:i}); Ps:耗时多
- 优选:var arr=[]; for(var i=1;i<20000;i++) arr.push({num:i})
- db.numbers.insert(arr);
- 比较操作符
| |
---|
大于 | $gt |
大于等于 | $gte |
小于 | $lt |
小于等于 | $lte |
等于 | $eq |
- 查询小于30的文档
- db.collections.find({num:{$lt:30}});
- 查询大于40小于50的文档
- db.collections.find({num:{
g
t
:
40
,
gt:40,
gt:40,lt:50}});
- 查询小于40或大于50的文档
- db.collections.find(==KaTeX parse error: Expected '}', got 'EOF' at end of input: or==:[{num:{lt40}},{num:{$gt50}}])
- $inc:在原有的基础上加值
- e.g:{$inc:{sal:400}} 工资加400 即:+=400
- db.collections.find({}).sort({sal:1,emp:-1})
- 1升序 -1降序 上面的例子是:先按sal排序,相同情况下按emp再排序
- skip() limit() sort() 可以以任意的顺序排序
- 投影
- 在查询时,可以在第二个参数的位置来设置查询结果
- db.collections.find({},{name:1,_id:0}) 查询结果只显示name字段
- 分页 每页显示10条 limit(每页显示的条数) skip()用于跳过指定数量的数据
- db.collections.find().skip((页码-1)*每页显示的条数).limit(每页显示的条数)
- 1.下载安装Mongoose
- 2.在项目中引入mongoose
- var mongoose = require (“mongoose”);
- 3.连接MongoDB
- mongoose.connect(‘mongodb://数据库的IP地址:端口号/数据库名’,{useNewUrlParser:true});
- 如果端口号是27017,则可以省略不写
- 监听MongoDB数据库的连接状态
- 在mongoose对象中,有一个属性叫connection,该对象表示的就是数据库连接 通过监视该对象的状态,可以来监听数据库的连接与断开
- 数据库连接成功:mongoose.connection.once(“open”,function(){});
- 数据库连接失败:mongoose.connection.once(“close”,function(){});
- 断开数据库连接
- mongoose.disconnect();//一般不需要调用
- Mongo数据库,一般情况下,只需要连接一次,连接一次以后,除非项目停止服务器关闭,否则连接一般不会断开
-Document是Model的实例,通过Model查询到的结果都是Document
- API文档中Model和Query的区别
- Model适合简单查询,保存,修改和删除。如:增删改查一条或者几条数据
- query适合复杂的查询。
首先获取一个query:
var query=personModel.find({});//当不带回调时会返回一个query对象
query
.skip(10)//跳过十行记录
.limit(10)//查询十行记录
.sort({_id:-1})//按id逆序排列
.where(‘age’).gt(17).lt(66)//age字段大于17小于66
.exec(function(err,data){
//回调函数,do some thing
});