Mongodb
服务相关
mongod –dbpath D:\develop\develop\mongodb-win32-x86_64-2008plus-ssl-4.0.12\data 后面是数据存储路径
连接服务
mongo localhost:27017/collection -uuser -ppassword
mongodb使用场景
抽象的场景非核心业务数据、不涉及事物、数据结构复杂易变、无需join查询、层级关系(用户、角色、权限)、目录结构、大容量缓存
具体业务使用场景举例:
- LBS(基于位置服务):外卖小哥历史位置、O2O当前位置附近的XXX、附近的人。(GeoJson可支持、先)
- 大容量缓存针对字段使用TTL索引。不经常更新但是量相对交大:手机联系人
- 日志:接口日志、三方调用日志、回调日志… mongodb 结构灵活
- 层级关系:用户、角色、权限,user、role、permission 就可以解决,不需要user_role、role_permission。解决mysql不支持数组及对象。
- 新应用,需求会变,数据模型无法确定,想快速迭代开发
创建表和库
mongodb 无需创建表和库,不存在会自动创建
mongodb是非关系型数据库,没有表的概念,有类似的概念 collection(表) document(行)
mysql 和 mongodb 概念对比
MySQL | MongoDB |
---|---|
库 | 库(database) |
表 | 集合(collection) |
行 | 文档(document) |
列 | 字段(filed) |
mysql mongodb 对比
对比 | MongoDB | MySQL |
---|---|---|
join search | support | $lookup(outer join)mongodb 3.2开始,但是只支持外关联查询 |
transaction | support | Starting in version 4.0, MongoDB provides the ability to perform multi-document transactions against replica sets.,shard 模式不支持Distributed transactions are scheduled for MongoDB 4.2 官方公布,4.2版本支持分布式事物 |
动态schema | not support | support |
shard | 需要第三方中间件mycat、sharding sphere等 | 原生支持 shard 模式 |
high available | support | replic模式 |
index | support | support,TTL indexes 支持数据过期失效(不支持联合TTL索引),可以当做大容量缓存 |
mysql mongodb 关键字对比
对比 | 关键字 | MySQL | 关键字 | mongodb |
---|---|---|---|---|
添加 | insert into | INSERT INTO user(属性名1,属性名2,属性名3) VALUES (value1,value2,value3) | insert | db.collection.insert( , {writeConcern: , ordered: }) |
查询 | select | select * from user where key = value | find、findOne | db.collection.find(query, projection) – query 是条件,projection 是筛选 |
更新 | update | update set key=value,key1=value2 where userName= ‘user’ | update、updateOne、updateMany | db.collection.update( , , { upsert: , multi: , writeConcern: , collation: , arrayFilters: [ , … ] } ) |
删除 | delete | delete from user where key = value | remove、deleteOne、deleteMany | db.collection.remove( , { justOne: , writeConcern: , collation: } ) |
排序 | order by | select * from user where id = 0 order by id desc | select * from user where id = 0 order by id desc | db.user.find({“userName”:”测试鱼”}).sort({“userName”:-1}) |
分页 | limite | select * from user where id = 0 limit 5,10 查询5-15 | skip + limit | db.user.find({“userName”:”测试鱼”}).skip(5).limit(10) 查询6-15 |
模糊查询 | select * from user where userName like ‘%测%’ select * from user where userName like ‘测%’ select * from user where userName like ‘%测’ | db.user.find({“userName”:/测/}) db.user.find({“userName”:/^测/}) db.user.find({“userName”:/测$/}) |
insert
insert 有两个参数: 查询条件、返回字段
db.user.insert({“userName”:”123″});
db.user.insertMany([{“userName”:”zhang”},{“userName”:”yu”},{“userName”:”liu”}]);
find (db.collection.find(query, projection))
db.user.findOne();
db.user.findOne().pretty(); 格式化json
db.user.find({“userName”:”123″});
元操作符 $ne、$in、$nin、$or、$exists、$type $gt、$get、$lt、$lte查询
元操作符是针对某个字段进行多条件筛选
db.user.find(“age”:{$get:5,$lte:10}) 10>age>5
db.user.find(“age”:{$ne:5}) age!=5
$in
db.user.find(“age”:{$in:[10,5]}) age in(10,5) 符合其中一个,就算
$nin
db.user.find(“age”:{$nin:[10,5]}) age not in(10,5)
$or
db.user.find({$or:[{“age”:”5″},{“age”:”10″}]}) — age=5 or age=10 or age in(5,10)
db.user.find({userName:”yu”,$or:[{“age”:10}]})
$type shell中插入的字段默认是double,数字类型-NumberLong(111)

db.user.find({“userName”:{$type:1}}) — 生产环境存在过字段类型不匹配,到时查询不出来
是否包含某个字段
db.user.find({“test”:{$exists:1}}) — 1 和 true 是等同的
db.user.find({“test”:null}) 查询不包含某个字段的数据
多操作符使用
db.user.find({“emergencyContact”:{$exists:1,$in:[{“userNane” : “雷浩”,”phone” : “18618314202”}]}})
db.user.find({“emergencyContact”:{$exists:1,$in:[{“userNane” : “雷浩”,”phone” : “18618314202”}]}}) json 顺序不一致,查询不到
数组操作 $size $all
db.user.find({“emergencyContact.userNane”:”雷浩”}) — 数组中对象嵌套
db.user.find({“hobby”:”tennis”})
db.user.find({“hobby”:{$in:[“ride”,”tennis”]}})
db.user.find({“hobby”:{$size:3,$in:[“tennis”,”jog”]}})
db.user.find({“hobby”:{$all:[“tennis”,”jog1″]}})
sort、limit、skip 分页排序
db.user.find({“userName”:”测试袁”}).sort({“numberInt”:-1}) — 根据numberInt倒序
db.user.find({“userName”:”测试袁”}).sort({“numberInt”:-1}).limit(1).skip(1)
projection operate $elemMatch和$ 返回first match 数组、$slice 返回数组中的前/后几个
db.user.find({“emergencyContact”:{$elemMatch:{“userNane”:”雷浩”,”phone”:”18618314202″}}})
db.user.find({},{“hobby”:{$slice:2}})
db.user.find({},{“emergencyContact”:{$elemMatch:{userNane:”雷浩”}}})
练习题区别:
db.user.find({“hobby”:[“tennis”,”jog”]}) ==关系,缺一不可,并且顺序一致
db.user.find({“hobby”:”tennis”}) ==子集的关系
db.user.find({“hobby.0″:”ride”}) == 数组第一个未知
db.user.find({“hobby”:{$all:[“tennis”,”jog”]}}) == 子集的关系
db.user.find({“hobby”:{$in:[“tennis”,”jog”]}}) 其中一个满足
update db.collection.updateOne(, , )
语法:db.collection.update( , , { upsert: , multi: , writeConcern: , collation: , arrayFilters: [ filterdocument1>, … ] })
db.user.update({“userName”:”测试鱼”},{“userName”:”测试鱼plus”}) — 覆盖更新,使用时需要注意
$set 更新局部字段
db.user.update({“userName”:”测试鱼”},{$set:{“userName”:”测试鱼plus”}}) –只更新对应字段,对应字段不存在添加字段
db.user.update({“userName”:”测试鱼”},{$set:{“userName”:”测试鱼plus”}},true) — 数据不存在,生成数据,并设置更新值
$unset(删除filed)
db.user.update({“userName”:”测试鱼”},{$unset:{“double”:””}},false,true) –批量删除指定字段
$rename
db.user.update({},{$rename:{“numberInt”:”numberLong”}},false,true)
update 数组操作 $push、$pull、$pop、 $addToSet
$push
db.user.update({“userName”:”测试袁”},{$push:{“hobby”:{$each:[“tennis”,”fishing”],$position:0}}},false,true) –向数组中首位添加数据
db.user.update({userName:”测试袁”},{$push:{“hobby”:”jump”}},false,true) — 想数组中添加数组
$pull 删除指定数组中的数据
db.user.update({“userName”:”测试袁”},{$pull:{“hobby”:{$in:[“tennis”,”fishing”]}}},false,true) –删除数组中的tennis、fishing
$pop(删除数组最前或者最后一位)
db.user.update({userName:”测试袁”},{$pop:{“hobby”:-1}}) 从第一位删除
$addToSet 向数组中添加不重复的数据,不保证修改后顺序
db.user.update({“userName”:”测试袁”},{$addToSet:{“hobby”:”tennis”}},false,true) 向数组中插入单条数据
db.user.update({“userName”:”测试袁”},{$addToSet:{“hobby”:{$each:[“tennis”,”fishing”]}}},false,true) 向数组中批量插入数据
deleteOne、deleteMany、 remove
db.user.remove({‘phone’:”18934317821″}) 删除所有符合,可以添加writeConcern
db.user.deleteOne({‘phone’:”18934317821″}) 删除第一条
db.user.deleteMany({‘phone’:”18934317821″}) 删除多条


