Mongodb基础

2021/9/27 19:11:24

本文主要是介绍Mongodb基础,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

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}}


这篇关于Mongodb基础的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!


扫一扫关注最新编程教程