mongodb 简介

Mongodb

服务相关

mongod –dbpath D:\develop\develop\mongodb-win32-x86_64-2008plus-ssl-4.0.12\data 后面是数据存储路径

连接服务

mongo localhost:27017/collection -uuser -ppassword

mongodb使用场景

抽象的场景非核心业务数据、不涉及事物、数据结构复杂易变、无需join查询、层级关系(用户、角色、权限)、目录结构、大容量缓存

具体业务使用场景举例:

  1. LBS(基于位置服务):外卖小哥历史位置、O2O当前位置附近的XXX、附近的人。(GeoJson可支持、先)
  2. 大容量缓存针对字段使用TTL索引。不经常更新但是量相对交大:手机联系人
  3. 日志:接口日志、三方调用日志、回调日志… mongodb 结构灵活
  4. 层级关系:用户、角色、权限,user、role、permission 就可以解决,不需要user_role、role_permission。解决mysql不支持数组及对象。
  5. 新应用,需求会变,数据模型无法确定,想快速迭代开发

创建表和库

mongodb 无需创建表和库,不存在会自动创建
mongodb是非关系型数据库,没有表的概念,有类似的概念 collection(表) document(行)

mysql 和 mongodb 概念对比

MySQLMongoDB
库(database)
集合(collection)
文档(document)
字段(filed)

mysql mongodb 对比

对比MongoDBMySQL
join searchsupport$lookup(outer join)mongodb 3.2开始,但是只支持外关联查询
transactionsupportStarting 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版本支持分布式事物
动态schemanot supportsupport
shard需要第三方中间件mycat、sharding sphere等原生支持 shard 模式
high availablesupportreplic模式
indexsupportsupport,TTL indexes 支持数据过期失效(不支持联合TTL索引),可以当做大容量缓存

mysql mongodb 关键字对比

对比关键字MySQL关键字mongodb
添加insert intoINSERT INTO user(属性名1,属性名2,属性名3) VALUES (value1,value2,value3)insertdb.collection.insert( , {writeConcern: , ordered: })
查询selectselect * from user where key = valuefind、findOnedb.collection.find(query, projection) – query 是条件,projection 是筛选
更新updateupdate set key=value,key1=value2 where userName= ‘user’update、updateOne、updateManydb.collection.update( , , { upsert: , multi: , writeConcern: , collation: , arrayFilters: [ , … ] } )
删除deletedelete from user where key = valueremove、deleteOne、deleteManydb.collection.remove( , { justOne: , writeConcern: , collation: } )
排序order byselect * from user where id = 0 order by id descselect * from user where id = 0 order by id descdb.user.find({“userName”:”测试鱼”}).sort({“userName”:-1})
分页limiteselect * from user where id = 0 limit 5,10 查询5-15skip + limitdb.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)
mongodb 字段类型

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″}) 删除多条