ICode9

精准搜索请尝试: 精确搜索
首页 > 数据库> 文章详细

Mongodb基础

2021-09-27 18:58:37  阅读:135  来源: 互联网

标签:tags Mongodb 基础 查询 db find test id


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

标签:tags,Mongodb,基础,查询,db,find,test,id
来源: https://blog.csdn.net/weixin_42410730/article/details/120514415

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有