首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >最佳实践| 一文读懂《MongoDB 使用规范及最佳实践》原理

最佳实践| 一文读懂《MongoDB 使用规范及最佳实践》原理

作者头像
MongoDB中文社区
发布于 2022-09-08 05:42:59
发布于 2022-09-08 05:42:59
2.7K00
代码可运行
举报
文章被收录于专栏:MongoDB中文社区MongoDB中文社区
运行总次数:0
代码可运行

点击下方公众号关注并分享获取 MongoDB 最新资讯

本文福利 · 分享有奖

为了感谢本公众号读者的支持,将本文章转发到朋友圈集赞满10个,就可获得社区定制马克杯套盒1份!

社区根据发送截图时间先后的前 10 名用户进行发放(每个 ID 仅参与一次哦~)

扫描文末二维码或添加小助手微信小芒果(ID:mongoingcom)凭截图领取~

注:活动截至时间:9 月 9 日18:00


一、MongoDB 使用规范与限制

MongoDB 灵活文档的优势

  • 灵活库/集合命名及字段增减
  • 同一字段可存储不同类型数据
  • Json 文档可多层次嵌套文档
  • 对于开发而言最自然的表达

MongoDB 灵活文档的烦恼

  • 数据库集合字段名千奇百怪
  • 同一字段数据类型各不一样
  • 业务异常可能写入“脏”数据

1.1 库命名规范

  • 不能为空字符串 ""
  • 不能以 $ 开头
  • 不能包含 . 号 /\
  • 数据库名大小写敏感
  • 数据库名最长为 64 个字符
  • 不能与系统库相同

最佳实践

  • 数据库命名只包含小写英文字符加下划线 _
  • 数据库名含多个单词考虑缩小并以下划线连接
  • 如:package_manager

1.2 集合名规范

  • 不能为空字符串 ""
  • 不能以 system. 系统集合名开头
  • 不因包含 ~!@#%^&*()-+

最佳实践

  • 集合命名只包含下划线和小写英文字母
  • 如:  students_books

1.3 Bson 单文档的大小及嵌套限制

  • 单文档不超过16 MB
  • 嵌套不能超过100 层

如果单条记录超过 16 M 怎么办?

第一种办法:先处理后存储。可以先做压缩,或者也可以对字符进行先哈希,然后再存储,这样大概率就不会超过 16 MB。

第二种方法:通常来说 16 MB 的记录都可以直接写到文本文件里面,然后再将文件存到 MongoDB GridFS 里面或者先业务层处理后存储。

1.4 索引限制

  • 单个集合最多包含 64 个索引
  • 单个索引记录不超过 1024 字节  [failIndexKeyTooLong 默认 true 控制是否报错]

当然其实我们也有其他的方式来解决类似这样的一个问题这个我们后面再说

  • 多列索引列个数最多不超过 31
  • 前台模式 createIndexes内存限制500 MB (maxIndexBuildMemoryUsageMegabytes 可调整)
  • 不允许创建多列数组的组合索引

实际上为什么有这个限制呢? MongoDB 如果索引字段是数组,那我们可以理解为对每个数组元素创建索引。如果要是多个数组字段建组合索引,就意味着它可能会产生笛卡尔级数据量的索引。所以为了避免这种索引的爆炸性增长,需要对此做了相应的一个限制。

  • TTL 索引如果是复合索引则过期将会失效

通常你想创建一个 TTL 索引,但创建的时候构建了多个字段的组合索引,那么 TTL 就会失效。

  • Hash 索引只支持单列 【<= 4.4 版本】

另外需要记住的就是哈希索引只支持单例,这个是在 4.4 之前的一个限制,到后面是做了调整,所以在这里也需要给大家提一下。我们本次分享为大部分内容的前提是小于等于 4.2 版本,主要原因在于 4.4 及其以上的 MongoDB 版本其实有很多企业里面都没有使用。

最佳实践  

  • 使用 background 模式批量创建索引

后台建索引意味着它不会阻塞我们的业务的写,否则的话就会加库级别的锁从而造成业务阻塞。当然还有一个情况就是当我们对同一个集合添加多个索引的时候,建议大家用 createIndexes 批量建索引。因为每次创建索引,实际上可以理解 MongoDB 都会去扫描整个集合,通过扫描整个集合去拿到对应字段的记录,然后将这些记录插入到索引文件里面,使用批量建索引只需要扫描一次,如果分开来建索引那么就需要扫描多次,故批量建索引能大大减少对业务的影响。

  • 多列索引尽量不要超过 5 个字段

这个算是一个经验建议,当然 6 个字段也行。有时候要反过来想,当一个索引有 5 、6 个字段或者 7 、8 个字段的时候,我们应该第一时间要反思我们业务设计是否合理。当然有些业务场景比较特殊也确实有这种必要性,那该放开限制还的放开。

  • 单个集合索引数量适当控制至 5 个

MongoDB 每次在数据插入更新删除的时候,实际上需要同步的去做索引的变更,所以索引越多,其实对于这些变更来说,它的代价就越大。所以,推荐创建尽量少的索引去满足更多的业务查询。

  • 尽量避免对数组字段创建索引

前面说过,对存储数组的字段创建索引,实际上是多数组每个元素创建索引,同时,字段值更新也同步更新索引字段。所以,当数组元素量非常大的时候比如 1 w,5 w,这个时候的索引代价就会比较大。

1.5 副本集限制

  • 副本集最多含有 50 个节点
  • 副本集只可含 7 个投票节点

最佳问答 

问:为何副本集只可含有 7 个投票节点?

答:提高选举效率、减少心跳网络代价

1.6 分布式集群限制

  • 分片 key 最大长度不能超过 512 字节
  • 分片 key 索引类型不能是 text 、数组索引和 geo 索引
  • 分片集合单个文档的条件操作必须带分片 key 或 _id 
  • 分片 key 及其值不允许修改( 4.2 版本前不允许修改 key 值,4.4 版本前不许变更 key 字段)

虽然 4.2 版本可以修改分片 key 的值,4.4 版本可以调整分片 key 的字段,但依然建议不要轻易调整 key 的值或 key 的字段构成 ,而是建议在初始化分片 key 的时候就评估好。

  • 分片集合不允许创建普通(不含分片 key 前缀)唯一性索引

1.7 多文档事务限制(>= 4.0)

  • 不支持系统库(config、local、admin)里的集合
  • 事务不支持元数据操作的修改(如 drop 集合)
  • 非增删改查如用户创建等操作不支持事务 事务执行周期默认最长 60 秒超过即自动崩溃退出

最佳实践    

  • transactionLifetimeLimitSeconds 参数控制超时时间
  • 一般建议不调整或调整为更小,加快资源的释放
  • 默认事务申请锁等待时间 5 ms 如果超时即崩溃退出

1.8 其他限制

  • 全集合扫描排序的内存限制 32 MB [否则报错]

最佳实践:

为排序添加索引;控制排序数据量

  • Aggregation 管道操作的内存限制 100 MB

最佳实践:

控制计算数据量

调整 allowDiskUse 允许磁盘排序

  • bulkWrite 操作每批最大操作数限制 1000 或 10 w (>= 3.6)

最佳实践:

通常建议实际业务每次批量控制在 1000 ~ 5000

默认情况下 bulkWrite 操作有序一般建议设置 false

为避免批量操作导致复制延迟可每批适当 sleep

其他建议

  • 查询、更新与删除必须带条件并且条件字段具有合适的索引
  • Update 必须使用 $set 否则会重置文档
  • Find 和 aggregate 操作建议按需返回对应的字段
  • 数组元素添加尽量使用 $push 并且避免对中间元素进行更新
  • 超高并发写入场景 4.0 版本之前尽量避免读写分离(存在全局复制锁阻塞业务读从库)

二、MongoDB 数据类型及容量评估

数据类型介绍

列表里面是 MongoDB 常见或者不常见的一些数据类型,可能大部分人没有详细地去梳理过,可以去仔细了解一下做参考。(可能有些不是 100% 的准确)

关于 MongoDB ObjectId

在插入一个文档时如果业务没有显示指定 _id 那么 MongoDB 会为每个文档生成一个ObjectId 类型的 _id 来作为主键其构成如下:

  • 4-byte 存储时间戳
  • 3-byte 存储机器码
  • 2-byte 存储进程 ID
  • 3-byte 计数器

自增性问题: _id 不绝对自增前 4 个字节是时间戳故只能精确到秒同一秒进程 ID 大小决定顺序

唯一性问题:同一个机器同一时间下因为计数器的存在,在 2^24-1 个值内都是唯一性

_id 存在意义:解决分布式场景下唯一性标志问题;复制依赖 _id 方便定位修改的记录

ObjectId 用例:

shell 下获取 _id 的时间戳方式  

_id.getTimestamp()

关于 MongoDB Date 类型

MongoDB 底层以 BSON 存储而按照 BSON Date/Time 数据类型定义日期时间被称为 UTC 时间,故业务计算时需注意与本地时间进行转换:

  • 获取当前本地时间 Date()
  • 获取当前 UTC 时间 new Date()

关于 MongoDB Timestamp

作为 BSON 特殊的时间戳类型 Timestamp 主要用于 MongoDB 内部使用期主要构成如下:

  • 前 32 位存储时间戳
  • 后 32 位存储同一秒内自增值

Timestamp 通常应用与复制中的 oplog,业务层面通常建议使用 Date 类型:

  • db.test.insert( { ts : new Timestamp() } )
  • 如果 ts 为嵌入式文档则默认时间戳为 0

关于 MongoDB 的 null

如字段 a 不存在 { }  与  {a:null }  相对等价 a

如果 a 字段不存在以及 a 等于空,它其实相对来说就是等价的。

  • db.test.insert({ _id: 1, item: null });
  • db.test.insert({ _id: 2 });
  • db.test.createIndex({item:1},{background:true})

存在性查询

  • db.test.find( { item : { $exists: false } } )

null值查询

  • db.test.find({item:null})

数据类型验证

$type 查询某个字段具体类型的数据

  • db.test.insert({a:1,mk:MinKey(),udt:new Date()})
  • db.test.find( { “a" : { $type: "double" } } )
  • db.test.find({mk:{$type:"minKey"}})
  • db.test.find({udt:{$type:"date"}})

mongo shell 下查看数据类型方法

  • typeof 1
  • NumberInt(1) instanceof NumberLong
  • [] instanceof Array NumberDecimal
  • (9999999.4999999999)  instanceof Number

数据类型比较

数据类型从小到大比较顺序如下:

  • MinKey
  • Null Numbers (ints, longs, doubles, decimals)
  • String
  • Object
  • Array
  • BinData
  • ObjectId
  • Boolean
  • Date
  • Timestamp
  • Regular Expression
  • MaxKey

验证用例:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
db.test.insert([{a:1},{a:MinKey()},{a:new Date()},{a:Timestamp()},{a:[1]},{a:null},{a:NumberLong(1)}])db.test.find({},{_id:0}).sort({a:1})

MongoDB 容量评估与计算

MongoDB 因其包含了非常规数据类型故对容量的评估不能参照关系型数据库评估方式

怎么去预估写入量?

实际上特别简单,不用去计算它每个字段的字节数或者有多少索引,每个索引它的字段对应的字节数,直接拿真实的环境或者跟线上环境类似的测试环境直接模拟写数据,然后直接去查看对应的一个数据大小就可以。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
show dbsadmin            0.000GBtest                 43.398GB                               //(storageSize+ indexSize) = du -sh  testlocal              9.794GBdb.stats(){"db" : "test","collections" : 5,"views" : 0,"objects" : 276054256,                         //所有集合的文档数 dataSize/avgObjSize"avgObjSize" : 190.81693790296063, //dataSize/objects (bytes)" dataSize" : 52675827825,                  //未压缩的数据大小不含索引(bytes)"storageSize" : 12666482688,              //存储引擎分配存储数据大小(bytes)"numExtents" : 0,"indexes" : 10,"indexSize" : 33932251136,                 //所有集合索引(压缩)大小储(bytes)"ok" : 1}
三、集合数据类型及合法性校验

对于 MongoDB 来说为什么要做数据类型及合法性校验?曾经在线上库我们看到如下图片的类似数据,看看 boo_id 存储的数据,各种类型数据都可以写入且没有任何问题。

  • MongoDB 3.2 开始在创建集合的时候提供了 validator 选项来规范插入和更新数据的规则
  • 为了增强 3.2 版本 validator 功能 MongoDB 3.6 提供了 JSON Schema 进一步完善校验规则
  • 对于数据库中已经存在集合可使用 collMod 来修改集合从而添加对应的 validator 校验规则
  • 对应类似于 validator 与版本相关的特性在数据库升降级过程中需要预先进行处理
  • 数据校验功能对插入更新的性能影响非常小线上环境亦可放心使用

Validation 相关概念

validator + 查询逻辑操作符

(除 $near、$nearSphere、$text、$where):定义具体的校验规则

validationLevel:定义了插入更新记录时应用校验规则的严格程度

  • strict:默认严格级别校验规则会应用到所有的插入与更新上
  • moderate:仅对 insert 和满足校验规则的文档做 update 有效
  • 对已存在的不符合校验规则的文档无效
  • off:关闭校验

validationAction:定义了当数据不满足校验规则的时候的具体动作

  • error:默认直接打印报错并拒绝文档
  • warn:日志打印告警提示但接受文档

Validation 使用限制  

  • 不允许在 local、admin 及 config 等系统库中的集合创建具有校验规则的集合
  • 不允许对 system.* 等系统集合创建校验规则

原因:避免系统内部操作无法正常写入系统集合而导致不可预料的问题

validation 的使用

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
db.createCollection( "validate_test",{ validator: { $and:[{ phone: { $type: "long" } },{ email: { $regex: /@mongodb\.com$/ } },{ status: { $in: [ "good", "bad" ] } }]},validationLevel: "moderate",validationAction: "error"} )db.validate_test.insert({phone:"123456789",email:"andy@mongodb.com",status:"good"})

Validation 属性修改

关闭校验

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
db.runCommand( {collMod: "validate_test",validationLevel: "off"} )db.validate_test.insert({phone:"000", status:"A"})

将校验级别修改为严格模式

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
db.runCommand( {collMod: "validate_test",validationLevel: "strict"} );

Validation 属性修改

修改校验之后的动作为告警

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
db.runCommand( {collMod: "validate_test",validationAction: "warn"} )

验证

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
db.validate_test.insert({phone:"000", status:"A"})

查看属性修改结果

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
db.getCollectionInfos({"name":"validate_test"})

MongoDB 3.6 增加 $jsonSchema 操作符 进一步增强了文档校验功能

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
db.createCollection("person", {validator: {$jsonSchema: {bsonType: "object",required: [ "name", "age", "sex" ],properties: {name: {bsonType: "string",description: "must be a string and is required"},age: {bsonType: "int",minimum: 0,maximum: 125,exclusiveMaximum: false},sex: {enum: [ "MAN", "WOMAN", null ]}}}}})

使用 collMod 修改 $jsonSchema 对应的校验规则

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
db.runCommand( {collMod: "person",validator: {$jsonSchema: { bsonType: "object",required: [ "name", "age", "sex" ]properties: {name: {bsonType: ["string","int"]},age: {bsonType: "int",minimum: 0,maximum: 125,exclusiveMaximum: false,},sex: {enum: [ "MAN", "WOMAN", null ]}}}},validationLevel: "moderate"} )

Variety 一个开源的 js 脚本集,提供了丰富的数据校验功能

功能特点:

  • 输出结果简单清晰
  • 可指定过滤条件及限制文档数量
  • 可正反序对集合进行分析
  • 可对部分字段进行排除
  • 可指定对嵌套文档的分析深度
  • 可指定输出格式及持久化分析结果
  • ……

Variety 用例:

对集合 users 进行分析

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
mongo 127.0.0.1:27017/test   --eval "var collection = 'users'" variety.js

按指定条件进行分析

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
mongo 127.0.0.1:27017/test  --eval "var collection = 'users', query = {'name':'Tom'}" variety.js

分析文档最大深度及指定输出格式

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
db.users.insert({name:"Walter", someNestedObject:{a:{b:{c:{d:{e:1}}}}}}); mongo127.0.0.1:27017/test --eval "var collection = 'users', maxDepth = 3,outputFormat='ascii'" variety.js

创建一个集合 test 并且使用 $jsonSchema 定义校验规则  

规则如下:

  • 集合必须含有 student_id、student_name、score 三个字段
  • student_id 必须是长整型
  • student_name 必须是字符串类型并且长度不操过 12 字符
  • score 必须是 4 字节整型并且大小介于 0 ~ 100 含 100 同时添加注释
  • 插入一条非法文档验证规则已经生效并获取 MongoDB 输出信息
  • 插入一条合法文档并使用 db.test.find({},{_id:0}) 查询结果必须如下:
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
{"student_id": NumberLong("100"),"student_name": "1234567890","score": 0}
 Q  A 

直播时设置 Q A 环节,让用户与嘉宾讲师可以更好的沟通,帮助解决相关应该场景等问题,助力于快速上手 MongoDB,规避常见使用问题。

让我们一起看看大家都有哪些问题吧!

向上滑动阅览对话

插入或更新导致索引记录超过1024 字节时默认报错失败,请至少提出一种解决方案规避此问题?

采用 hash 索引即可

如何理解分片 Key 及其值为何不允许修改的理解?

早期不支持分片 Key 的值修改,主要是修改 Key 的值可能需要涉及到数据移动,同时 MongoDB 4.2 之前不支持分布式事物,修改分片 Key 值后数据迁移可能存在数据不一致。

如何理解分片集合不能创建普通唯一性索引?

普通唯一性索引只能在单分片中起到唯一性约束的作用,跨分片无法做唯一性检查或者说实现代价太大。

如何理解 MongoDB 中_id 值不采用严格自增 ID 的方式生成?

没有必要,而且分布式集群要实现严格自增代价太大。

集合的命名可以加 / 吗?

不建议加,就是任何的集合命名或者数据库命名建议除小写字母、数字及下划线外,不要使用其他任何特殊字符,报错简单清晰。

关于MongoDB,个人有一点使用方面的问题:易用性 尤其是使用意聚合框架时,易用性相比较关系型数据库的 SQL 操作,差好多,很多时候需要搜文档现学现用。有没有什么使用上的工具或技巧呢?

建议用MongoDB官方开源的 Compass 里面有专门对 Aggregate 写法的格式化图形界面,用起来还可以,建议试试。

对于千万级表的聚合操作性能问题 有没有优化手段?比如:sum...group by...

业务层分批计算后合并结算结果或建议将数据同步至数仓,用数仓去解决重查询的场景。

带条件的 Count 千万数据就很慢,怎么优化比较好?

建议采用计数表,或加一层缓存。

阅读完文章,想要获取李丹老师带来的《MongoDB 使用规范及最佳视频》直播的回放视频,可以点击文末左下角 [阅读原文] 获取~

社区邀请函 

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
为了让社区组委会成员和所有广大 MongoDB 爱好者的灵活参与,我们特此为想要深度参与社区建设的伙伴们开设了快速加入社区的 “ 绿色通道 ” 
如果您也有优质的原创文章分享 ?
如果您也有可以参与线上直播分享的干货内容 ?如果您也想加入社区,成为社区核心用户,领取社区专属 IP 头衔 ?

在这里您将会得到:
结交志同道合的技术伙伴沉淀有价值的干货内容一个展示自己的舞台提升自身的技术影响力即刻加入社区~点击提交申请或者联系助手小芒果(ID:mongoingcom)了解详细事宜~
我们一定为各位伙伴准备的内容价值最大化,并且提供一个专属的舞台,加入还有机会领取社区专属定制精美礼品和专属 IP 头衔!!!



获取更多精彩内容点击社区网站www.mongoing.com
扫描上方二维码添加小芒果微信(ID:mongoingcom)进入中文用户组技术交流群
长按二维码加入我们
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2022-09-07,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Mongoing中文社区 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
一文了解Mongodb使用的语法
在使用数据库之前,我们需要先了解下其基本的数据结构类型。防止我们出现类型不匹配的问题。 支持的数据类型补充的是本人在开发中经常使用的。还有更多的数据类型可以参考官方文档。
用户2196435
2018/11/08
6350
了解 MongoDB 看这一篇就够了
MongoDB 是一款流行的开源文档型数据库,从它的命名来看,确实是有一定野心的。MongoDB 的原名一开始来自于 英文单词"Humongous", 中文含义是指"庞大",即命名者的意图是可以处理大规模的数据。
美码师
2019/10/18
1.4K0
了解 MongoDB 看这一篇就够了
MongoDB学习整理
MongoDB 是介于关系数据库和非关系数据库之间的产品,是非关系数据库中功能最丰富,最像关系数据库的,语法类似javascript面向对象的查询语言,是一个面向集合的、模式自由的文档型数据库。
CS逍遥剑仙
2019/01/01
9150
mongodb概念
https://www.runoob.com/mongodb/mongodb-databases-documents-collections.html
用户10325771
2023/03/01
4870
mongodb概念
2020最新MongoDB规范你应该了解一下
MongoDB是非关系型数据库的典型代表,DB-Engines Ranking 数据显示,近年来,MongoDB在 NoSQL领域一直独占鳌头。MongoDB是为快速开发互联网应用 而设计的数据库系统,其数据模型和持 久化策略就是为了构建高读/写的性能,并且可以方面的弹性拓展。随着MongoDB的普及和使用量的快 速增长,为了规范使用,便于管理和获取更高的性能,整理此文档。我们从 数据库设计规范、集合设计 规范、索引设计规范、文档设计规范、API使用规范、连接规范等方面进行阐述和要求。
MongoDB中文社区
2020/06/24
2K0
mac系统下安装、启动、停止mongodb
MongoDB 下载地址: https://www.mongodb.com/download-center?jmp=nav#community nodejs下载地址: https://nodejs.o
极客教程
2018/03/01
2.5K0
mac系统下安装、启动、停止mongodb
MongoDB分片集群原理、搭建及测试详解
随着技术的发展,目前数据库系统对于海量数据的存储和高效访问海量数据要求越来越高,MongoDB分片机制就是为了解决海量数据的存储和高效海量数据访问而生。 MongoDB分片集群由mongos路由进程(轻量级且非持久化进程)、复制集组成的片shards(分片一般基于复制集故障转移和冗余备份功能)、一组配置服务器(存储元数据信息,一般冗余3台)构成。
用户7353950
2022/06/23
1.5K0
MongoDB Change Stream之一——上手及初体验
Change Stream可以直译为"变更流",也就是说会将数据库中的所有变更以流式的方式呈现出来。用户可以很方便地对数据库建立一个监听(订阅)进程,一旦数据库发生变更,使用change stream的客户端都可以收到相应的通知。使用场景可以包括但不限于以下几种:
phoenix、
2020/10/10
10.8K0
MongoDB Change Stream之一——上手及初体验
MongoDB删数据---一个无聊的测试
上周五的时候,线上的一个MongoDB集群需要删除部分数据,这个MongoDB集群本身是个分片集群,包含10个分片,架构如下:
AsiaYe
2021/11/09
8560
MongoDB删数据---一个无聊的测试
MongoDB入门实操《中篇》
首先我们来了解几个概念,虽然MongoDB入门实操《上篇》这篇文章已经提到过,这里再次加深印象: 集合:Mongo 中的集合就是mysql 的表的表现形式 文档:文档的数据结构和JSON 基本一样,它就是集合(表)中的一条记录,相当于mysql 的行row 字段:Mongo 中的field 相当于mysql 中的column 索引:Mongo 中的index 与mysql 的index 一样 主键:Mongo 中的primary key 与mysql 的一样,其中Mongo 中将_id 自动设置为主键
Wu_Candy
2022/07/04
2550
都 2020了,你该知道MongoDB优化策略了~
MongoDB 是高性能数据,但是在使用的过程中,大家偶尔还会碰到一些性能问题。MongoDB和其它关系型数据库相比,例如 SQL Server 、MySQL 、Oracle 相比来说,相对较新,很多人对其不是很熟悉,所以很多开发、DBA往往是注重功能的实现,而忽视了性能的要求。其实,MongoDB和 SQL Server 、MySQL 、Oracle 一样,一个 数据库对象的设计调整、索引的创建、语句的优化,都会对性能产生巨大的影响。
JavaEdge
2020/05/27
2.2K0
MongoDB 从4.4到7.0各个版本特性概览
在数据库技术日新月异的今天,MongoDB作为领先的NoSQL数据库之一,持续地推出新版本以满足不断变化的企业需求和技术挑战。从MongoDB 4.4至7.0,每一版都融入了创新特性,旨在提升性能、扩展性、安全性和易用性,同时也反映了行业趋势和用户反馈。本文旨在全面剖析这些版本中的关键新特性,不仅是为了记录技术演进的历史,更是为了赋能数据库管理员、开发者和架构师,使他们能够充分理解并利用这些新功能,从而优化数据管理和应用性能。
DBA实战
2024/09/06
4940
MongoDB 从4.4到7.0各个版本特性概览
MongoDB后台shell语句(一)
1.连接数据库 ./mongo 2.创建数据库 (如果数据库不存在,则创建数据库,否则切换到指定数据库。)
六月的雨在Tencent
2024/03/28
2170
MongoDB使用小结:一些常用操作分享
本文整理了一年多以来我常用的MongoDB操作,涉及mongo-shell、pymongo,既有运维层面也有应用层面,内容有浅有深,这也就是我从零到熟练的历程。
拓荒者
2019/09/06
2.2K0
mongodb11天之屠龙宝刀(三)基本操作:增删改查与mysql对比
mongodb11天之屠龙宝刀(三)基本操作:增删改查与mysql对比 基本概念_id和ObjectId: 1._id   MongoDB 中存储的文档必有一”_id” 键。这个键的值可以是任何类型的,默认是个ObjectId 对象。在一个集合里面,每个文档都有唯一的”_id” 值,来确保集合里面每个文档都能被唯一标识。如果有两个集合的话,两个集合可以都有一个值为123 的”_id” 键,但是每个集合里面只能有一个”_id” 是123 的文档。 2. ObjectId   ObjectId 是”
学到老
2018/03/19
7090
mongodb11天之屠龙宝刀(三)基本操作:增删改查与mysql对比
为MongoDB添加分片副本集
MongoDB分片相关的知识,之前介绍过了,今天我们来看如何为一个已经分片好的集群添加一个新的分片副本集。
AsiaYe
2021/01/24
1.5K0
MongoDB索引使用总结
MongoDB 提供范围广泛的索引类型和功能以及特定于语言的排序顺序,以支持对数据的复杂访问模式。 MongoDB 索引可以按需创建和删除来适应不断变化的应用程序需求和查询模式,并且可以在文档中的任何字段上声明,包括嵌套在数组中的字段。本文介绍一下 MongoDB 中的索引底层结构、索引遍历过程、建索引以及如何使用。
腾讯技术工程官方号
2024/04/18
1.1K1
MongoDB索引使用总结
MongoDB急速入门
前面我们已经介绍过缓存k-v数据库Redis,华为的OpenGauss关系型数据库,今天我们继续介绍一款NoSQL数据库MongoDB。
Python研究所
2022/09/01
6560
MongoDB数据库(二)
# _id是指定用什么字段分组,需要写成$sex, $sum:1表示此行数据计算为1
不断折腾
2019/09/23
1.6K0
MongoDB Capped Collection
MongoDB Collection可以理解为关系型数据库的表,当第一次在Collection存储数据或者创建索引时,如果该Collection不存在,则会首先创建该Collection,如下:
shysh95
2024/06/03
2190
MongoDB Capped Collection
相关推荐
一文了解Mongodb使用的语法
更多 >
交个朋友
加入腾讯云官网粉丝站
蹲全网底价单品 享第一手活动信息
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验