mysql和mongodb 对比:
https://ifeve.com/mongodb%E5%92%8Cmysql%E5%AF%B9%E6%AF%94%E8%AF%91/
1.MongoDB 的优势:
MongoDB文档自然映射到现代的面向对象编程语言。使用MongoDB可以避免将代码中的对象转换为关系表的复杂对象关系映射(ORM)层。
扩展迁移灵活
灵活的数据模型
MongoDB使用场景:是各种场景下的通用数据库,而需要复杂多行事务的应用如订票系统等则最好使用mysql等关系型数据库
2.mongodb命名限制
(1)数据库名称不区分大小写,但是字段名字是区分的
window上不能包括:"$*<>:|?和空字符串 linux上不能包括"$和空字符串
3.mongodb和mysql关键字对应
4.文档结构
(1)文档又字段和值构成,值可以是任何BJSON结构,字段名称是字符串
(2)字段名称的限制:
_id是保留字段,在集合中唯一,且不可变,可以是数组以外任意类型,插入时可以自己指定,否则会自动生成;字段名称不能以美元符号$开头
(3)文件大小限制
BSON一个document最大大小为16MB
5**_id的说明(类似mysql的主键)**
(1)默认情况下会在该字段创建唯一索引,该字段始终会是第一个字段,插入时如果服务端收到的不是该字段,则会将该字段移动到开头,该字段不能是数组,其他bson结构都可
(2)常用的_id选项:ObjectId、业务唯一标识符(可以避免再添加附加索引,否则还得添加业务索引)、递增自然数
6 BSON类型说明
(1)BSON和JSON的区别
https://blog.csdn.net/lyq240919525/article/details/40440877
(2)BSON的优势:
遍历和解析速度快,每个元素(对象)存储时长度都存在元素头部,读长度直接可以seek到指定点,而json就需要对整个document扫描;操作简单:BSON在小规模修改时,比如9改为10,只需要在二进制位上修改即可,后面不用动,而JSON是基于字符串的,可能需要整体都修改移动
(3)BSON主要用在mongodb存储上,是一种二进制存储的格式,定义规范:https://bsonspec.org/spec.html,参考 https://blog.csdn.net/lyq240919525/article/details/40440877
(4)BSON采取的是小端存储方式
7.ObjectId
(1)12字节组成: 4字节的Unix时间戳(秒级)+5字节的随机数+3字节自增数,采取大端存储方式,
一般会设计成以下,由客户端实现,跟雪花算法一样,可以保证分布式下的_id唯一
img
8.BSON字符串编码格式默认为UTF-8,能处理绝大多数字符
9 mongo CRUD
(1)创建/新增操作,直接插入即可,collection不存在时就会创建,主要方法
insertOne(document),insertMany([doc0,doc1…])
(2)查询操作:
参考:查询选择器 https://mongodb.net.cn/manual/reference/operator/query/#query-selectors db.my_test.find() 查全部 等值查询: $eq 同理使用$ne db.my_test.find({q:1})按条件 db.my_test.find({q:{$eq:1}}) 等于数组 db.my_test.find({tags:['A','B']}) 查询字段tags与给定的条件数据完全相等或者tags中包含某个元素是数组,且与给定数组相同 查询结果:{ _id: 3, item: { name: "ij", code: "456" }, qty: 25, tags: [ "A", "B" ] } { _id: 5, item: { name: "mn", code: "000" }, qty: 20, tags: [ [ "A", "B" ], "C" ] } 而不匹配: { _id: 3, item: { name: "ij", code: "456" }, qty: 25, tags: [ "B" ,"A"] } 嵌套等值查询,一定要加引号,否则语法错误 db.my_test.find({"out.inner0.q":1}) # 嵌套式document查询使用点符号:“ doc0.doc1.name":value 范围查询$in,语义上相当于$or,同理使用$nin db.my_test.find(_id:{$in:[123,ObjectId("615171366afb51344b68592b")]}) db.my_test.find(tags:{$in:['A','B']}}) 查询数组tags中包含A或者B的document $in与正则表达式一起使用 /pattern/ db.my_test.find({line_id:{$in:[/^631.*/,/^IHA.*/]}}) 集合中可匹配多个正则表达式 $gt $lt $gte $lte 大小范围查询 db.sc_fault.find({report_time:{$gt: new Date('2021-09-10'),$lt: new Date('2019-02-01')}}) 逻辑查询 $and $not $nor $or 其中nor是对or求补集,与or的结果互补 {$and:[{line_id:{$in:[/^631.*/,/^IHA.*/]}}, {level:{$gt:3}}]} nor举例: {$or:[{test:'test'},{many:'many'},{qty:{$lt:25}}]} 查询test=test或者many=many或者qty<25 则 $nor查询的是test!=test and many!=many and qty>=25的数据 $exists 字段是否存在查询 {$and:[{test:'test'},{many:{$exists:false}}]} 匹配test字段=test 但是many字段不存在 $type按照字段类型查询,mongo支持按照字段别名查询,字段类型如下 {_id:{$type:'objectId'}} img 对数组的查询 $all 匹配数组包含所有查询元素的document {tags:{$all:['A','B' ]}} 查询tags中包含A和B的document 相当于 {tags:{$and:[{tags:'A'},{tags:B}]}} $elemMatch 给定一个范围条件,返回至少有一个数组元素符合条件的对应的document {tags:{$elemMatch:{$lt:'C'}}} 只要tags中存在小于C的元素则返回该document $size 匹配数组长度 {tags:{$size:3}}