在介绍选型之前先来介绍下架构背景,笔者曾经做过电商系统的优化,该系统中包含的两个主体: 用户:数据量上千万,每日增长10W+ 订单:数据量上亿,每日百万级的增长 对于如此量级的数据,单库单表的情况下,无论是...NoSQL 说到NoSQL,第一个想到就是MongoDB ,它的分片功能从并发性和数据量这两个角度已经能满足一般大数据量的需求,但是仍然需要考虑如下几点: 约束性:MongoDB 不是关系型数据库而是文档型数据库...分片键如何选择?...ShardingKey,为什么呢?...(store_id) 以上三种业务场景,判断下优先级,C端用户肯定是需要优先满足,因此使用user_id作为ShardingKey 这样在查询时需要将user_id传递过来才能定位到指定库、表 选择字段作为分片键时
MongoDB简介 在 MongoDB中,没有 表、列的概念,取而代之的是 集合(collection)、文档(document) 库(DB): 数据库,包含多个集合 集合(Collection):...一组文档 文档(Document): 键值对的一个有序集,即有序的哈希表 MongoDB内置 JavaScript解释器,它的文档是 JS中的对象( {...})...,就是那种没成员函数的对象 MongoDB默认运行于 27017端口 MongoDB以 BSON格式保存数据,即 BinaryJson ---- 简单操作 CRUD操作 文档插入后会自动添加一个 _id...name": {"$size": 4} }) null值 db.collection.find({key1: null}) // 返回所有无key1键的文档...RegExp db.collection.find({"name": {"$regex": /^[a-z]{0,4}$/i}}) // 可加入正则flag位,如i忽略大小写 $slice,返回键中数组切片
模式设计 MongoDB中的数据有一个动态设计。集合强制执行文档结构。这有助于迭代开发和多态性。然而,集合通常保存具有高度同质结构的文档。有关详细信息,请参阅数据建模概念。...确保模式设计支持您的部署类型:如果您计划使用分片集群进行水平扩展,请设计您的模式以包含一个强健的片键。片键通过确定MongoDB如何划分数据来影响读写性能。...请参见:片键对集群操作的影响以获取有关片键应具有哪些质量的信息。一旦设置了片键,就不能更改它。 请确保您的模式设计不依赖长度不受限制的索引数组。...通常,当这种索引数组的元素少于1000个时,可以获得最佳性能。 模式架构时请考虑文档大小限制。BSON文档大小限制为每个文档16MB。如果需要更大的文档,请使用GridFS。...有关辅助读取的信息,请参阅:读取偏好 。 分片 确保片键将负载均匀地分配到分片上。请参见:片键以获取更多信息。 对需要根据切片数量进行扩展的工作负载使用目标操作。
max 数值 (可选)指定固定集合中包含文档的最大数量。 在插入文档时,MongoDB 首先检查固定集合的 size 字段,然后检查 max 字段。...6.2 多个条件 MongoDB 的 find() 方法可以传入多个键(key),每个键(key)以逗号隔开,即常规 SQL 的 AND 条件。...MongoDB 的 find() 方法可以传入多个键(key),使用关键字 $or,,即常规 SQL 的 OR 条件。...指定返回的键,不返回其他键,exclusion模式 指定不返回的键,返回其他键。...两种模式不可混用(因为这样的话无法推断其他键是否应返回),只能全1或全0,除了在inclusion模式时可以指定_id为0。
有关GridFS的更多信息,请参阅mongofiles和驱动程序的文档。 BSON文档的嵌套深度 MongoDB支持不超过100层嵌套深度的BSON文档。...MongoDB不会将任何具有索引字段的文档插入到索引集合中,该文档的索引字段的对应索引条目将超过索引键限制,而是将返回错误。MongoDB的早期版本将插入此类文档,但不会为其创建索引。...如果更新的值导致索引条目超过索引键限制,则对索引字段的更新将出错。如果现有文档包含索引条目超过该限制的索引字段,则导致该文档在磁盘上重新定位的任何更新都将返回错误。...使用混合版本副本集(其中次要版本为2.6和主版本为版本2.4),从节点将复制在2.4主版本上插入或更新的文档,但是如果文档包含一个索引字段(其对应的索引条目超过了索引键限制),则会在日志中显示错误消息。...否则将返回错误。 分片集合中的唯一索引 MongoDB不支持跨分片的唯一索引,除非唯一索引包含完整的分片键作为索引前缀。在这些情况下,MongoDB将在整个索引键上而不是单个字段上进行唯一性约束。
MongoDB MongoDB是一个高性能,开源,无模式的文档型数据库,是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。...上面代码的流程就是 创建 链接对象 option 和 context , 然后写入 mongo.Connect , Connect 函数返回一个链接对象 和一个错误 对象,如果错误对象不为空,那就链接失败了...操作数据库 CRUD操作 命令行输入mongo -u"xxx" -p"xxx" 进入mongodb 插入文档 插入单个文档 collection.InsertOne() type Student struct...= nil { log.Println(err) } 插入多条文档 collection.InsertMany() 不同的是接受一个 切片作为数据集合: type Student struct...更新单个文档 collection.UpdateOne() 如果有多个满足条件的,只更新第一条 // filter: 包含查询操作符的文档,可以用来选择要查询的文档 // 查询到name=hyy的文档
根据一般经验,对于数据库是什么以及它们能干什么,人们会有先入为主的认识。为了给他人提供方便,本文列出了一些常见的错误。 本文要点 即使 MongoDB 没有强制要求,设计一个模式还是至关重要。...没有设计一个模式 对于模式,MongoDB 没有强制要求。这不是说它不需要模式。如果你真想保存文档而又没有一致的模式,那么你可以非常快速、简单地保存它们,但是 检索会十分麻烦 。...使用大数组创建文档 文档可以包含数组。最好是把数组元素的数量保持在四位数以下。如果数组频繁添加,会使得包含它的文档过大,那样, 它在磁盘上的位置就需要移动 ,反过来,这意味着 每个索引都必须更新 。...对于排序操作中所有文档的总大小, 有 32MB 的内存限制 ,如果 MongoDB 达到了这个限值,它就会产生错误,或者有时候 仅仅返回一个空的记录集 。...为了确保可靠性,查询或聚合必须是“确定的”,就是说,它们每次执行都会给出相同的结果。包含$limit 而不包含$sort 的代码不是确定的,后续会导致难以跟踪的 Bug。
为了给他人提供方便,本文列出了一些常见的错误。 创建一个无需身份验证的MongoDB服务器 很遗憾,MongoDB在安装时默认不启用身份验证。在只从本地访问的工作站上,这没什么不好。...没有设计一个模式 对于模式,MongoDB没有强制要求。这不是说它不需要模式。如果你真想保存文档而又没有一致的模式,那么你可以非常快速、简单地保存它们,但是检索会十分麻烦。...MongoDB在单个文档的大小为几KB时表现最好,处理它们的方式更像宽SQL表的行。大文档会导致多种性能问题。 使用大数组创建文档 文档可以包含数组。最好是把数组元素的数量保持在四位数以下。...对于排序操作中所有文档的总大小,有32MB的内存限制,如果MongoDB达到了这个限值,它就会产生错误,或者有时候仅仅返回一个空的记录集。...为了确保可靠性,查询或聚合必须是“确定的”,就是说,它们每次执行都会给出相同的结果。包含limit而不包含sort的代码不是确定的,后续会导致难以跟踪的Bug。
- 数据操纵语言,数据定义语言 - 严格的一致性 - 基础事务 NoSQL - 代表着不仅仅是SQL - 没有声明性查询语言 - 没有预定义的模式 -键 - 值对存储,列存储,文档存储,图形数据库...文档中的值不仅可以是在双引号里面的字符串,还可以是其他几种数据类型(甚至可以是整个嵌入的文档)。 MongoDB区分类型和大小写。 MongoDB的文档不能有重复的键。 文档的键是字符串。..._id 键默认返回,需要主动指定 _id:0 才会隐藏 两种模式不可混用(因为这样的话无法推断其他键是否应返回) ? 只能全1或全0,除了在inclusion模式时可以指定_id为0 ?...默认值为 false. sparse Boolean 对文档中不存在的字段数据不启用索引;这个参数需要特别注意,如果设置为true的话,在索引字段中不会查询出不包含对应字段的文档.。...这样的话结果中就只还有_id,tilte和author三个字段了,默认情况下_id字段是被包含的,如果要想不包含_id话可以这样: ? 2.$match实例 ?
id: 0 以便从结果集中排除_id字段,因为上面创建的索引不包含_id字段。...索引键通常都比目录文档要小的多,索引键通常在内存中或连续地存储于磁盘上。 限制 索引字段上的限制 如果出现下面的情况,一个索引就不能够覆盖一个查询: 集合中有一个文档包含一个数组类型的字段。...分片集合上的限制 当运行一个mongos ,索引不能覆盖分片集合上的查询,如果索引不包含片键,但对_id索引有如下例外:如果查询分片集合仅仅指定关于_id字段的查询条件并且仅返回_id字段,那么运行一个...每一阶段将结果(例如文档或索引键)传递给父节点。叶节点使用集合或索引。内部节点操作来自子节点的文档或索引键。根节点是MongoDB提供的结果集中的最终阶段。...如果查询方案规划者选择一个索引,解释结果包含一个IXSCAN 阶段。这个阶段包含一些信息,例如索引键模式,遍历的方向,索引界限。
如果exists的值为true,选择存在该字段的文档;若值为false则选择不包含该字段的文档(我们上面在查询键值为null的文档时使用"exists的值为true,选择存在该字段的文档;若值为...false则选择不包含该字段的文档(我们上面在查询键值为null的文档时使用"exists的值为true,选择存在该字段的文档;若值为false则选择不包含该字段的文档(我们上面在查询键值为null...的文档时使用"exists"判定集合中文档是否包含该键)。...m 默认情况下,PCRE 认为目标字符串是由单行字符组成的(然而实际上它可能会包含多行).如果目标字符串 中没有 "\n"字符,或者模式中没有出现“行首”/“行末”字符,设置这个修饰符不产生任何影响...s 如果设置了这个修饰符,模式中的点号元字符匹配所有字符,包含换行符。如果没有这个修饰符,点号不匹配换行符。
插入数据到服务器时间,不会等待服务器的响应,驱动会假设写入是成功的,实际是使用客户端生成对象id,但是该行为可以通过配置配置,可以通过安全模式开启,安全模式可以校验服务器端插入的错误。...而MongoDB数据的基本单元是BSON文档,在键值中有指向不定类型值的键,MongoDB拥有即时查询,但不支持联结操作,简单的键值存储只能根据单个键来获取值,不支持事务,但支持多种原子更新操作。...3.关注MongoDB schema 的设计模式 内嵌与引用 :当子对象总是出现在父对象的上下文中时,使用内嵌文档;否则将子对象单独存一个集合。...(3)唯一性索引 (4)稀疏索引 如索引的字段会出现null的值,或是大量文档都不包含被索引的键。..."}).count() //查看日志迁移记录 4.分片的查询与索引 (1)分片查询类型 针对性查询:查询包含分片键 全局查询或分散/聚集查:查询不包含分片键 查询过程:通过分片键将查询路由给指定分片,一旦到了某个分片上
插入数据到服务器时间,不会等待服务器的响应,驱动会假设写入是成功的,实际是使用客户端生成对象id,但是该行为可以通过配置配置,可以通过安全模式开启,安全模式可以校验服务器端插入的错误。...而MongoDB数据的基本单元是BSON文档,在键值中有指向不定类型值的键,MongoDB拥有即时查询,但不支持联结操作,简单的键值存储只能根据单个键来获取值,不支持事务,但支持多种原子更新操作。...3.关注MongoDB schema 的设计模式 内嵌与引用 :当子对象总是出现在父对象的上下文中时,使用内嵌文档;否则将子对象单独存一个集合。...(3)唯一性索引 (4)稀疏索引 如索引的字段会出现null的值,或是大量文档都不包含被索引的键。..."}).count() //查看日志迁移记录 4.分片的查询与索引 (1)分片查询类型 针对性查询:查询包含分片键 全局查询或分散/聚集查:查询不包含分片键 查询过程:通过分片键将查询路由给指定分片,
JSON Schema方法非常适用于你对集合的数据类型及键值很了解,集合的组织风格越接近一张表的格式,这种方法越有价值。JSON模式只适用于组织了足够多的集合,使您能够了解数据的类型和使用的键。...比如你导入了包含日期的JSON格式的数据,由于JOSN没有标准的表示日期的方法,因此它将被解析成字符串。但是你想对文档基于日期排序,它将变得很棘手,如果你想基于日期进行索引查询,感觉行不通。...mongoimport可以使用这两种类型,但是mongo shell模式不能识别标准JSON解析器。SQL Server以标准JSON导出,尽管它在CLR和不推荐的数据类型方面可能存在问题。...最简单的方法是,它在每个文件中生成这样的代码(我只显示了前面几个文档)。我选择检查是否有基于一列的主键,如果有,我使用它作为MongoDB键,通过使用保留标签“_id”来指示。...注意,到实际数据的路径在键字段上有双引号。这是因为在WITH显式模式语句中的路径表达式中,美元符号是不合法的。
静态类型:Go语言是一种静态类型的语言,可以在编译时检查类型错误,避免了很多运行时错误。 简洁易学:Go语言的语法简洁易学,没有过多的复杂特性,上手比较容易。...数组类型:[n]T表示具有n个元素的T类型数组。 切片类型:[]T表示一个元素类型为T的切片。 映射类型:map[K]V表示具有K类型键和V类型值的映射。...每个子目录都应该是一个独立的程序,有一个主要的 main.go 文件,并使用相关的包来实现其功能。 internal/:该目录包含项目内部的代码,这些代码不希望被其他包或程序使用。...这些包通常只由主要的可执行程序使用。 pkg/:该目录包含可重用的包,这些包可以由其他项目使用。每个子目录都应该是一个独立的包,有自己的API和文档。 vendor/:该目录包含项目的依赖项。...go.sum:该文件包含所有依赖项的哈希值,用于确保依赖项的版本不会改变。 README.md:该文件包含项目的说明和文档。 请注意,这只是一种常见的工程结构,不是硬性规定。
集合(collection)可以看作是一个拥有动态模式(dynamic schema)的表。 MongoDB的一个实例可以拥有多个相互独立的数据库(database),每一个数据库都拥有自己的集合。...MongoDB 将数据存储为一个文档,数据结构由键值(key=>value)对组成。MongoDB 文档类似于 JSON 对象。字段值可以包含其他文档,数组及文档数组。...以下划线”_”开头的键是保留的(不是严格要求的)。 MongoDB的文档不能有重复的键。 MongoDB不但区分类型,而且区分大小写。...随之而来的一个问题是:既然没有必要区分不同类型文档的模式,一个数据库还有必要使用多个集合吗? 这里的不区分仅仅是物理结构的不区分,但实际开发中由于业务的分区,会产生多个逻辑集合单元。...下面的文档中things这个键的值是一个数组 { “things” : [ “foot” , 3.14 ] } 此例表述数组可包含不同数据类型的元素。 数组也可嵌套数组。
MongoDB 是当前比较流行的文档型数据库,其拥有易使用、易扩展、功能丰富、性能卓越等特性。...MySQL 的半同步复制模式保证数据库的强一致,Oracle DataGuard 的最大保护模式也能够保证数据库的强一致,而 MongoDB 可以通过 getLastError 命令来保证写入的安全,但其毕竟不是事务操作...shard server:实际存储数据的分片。生产环境要求是副本集。 下面我简单画了一下分片的过程: 在分片之前,可以把一个集合看成是单一整块儿,所有文档都包含在这个块当中。...现象:所有与该键值接近的文档都会保存在同一范围的块中。 我们还可以根据应用类型不同选择合适的片键,其策略如下: 散列片键(Hashed Shard Key):随机分发。...的散列片键:GridFS 非常适合做分片,因为可以包含大量的文件数据 流水策略:集群中某服务器性能更加(如 SSD),使用标签+升序片键方案让该服务器处理更多的负载 弊端:如果请求超出了强大服务器的处理能力
字段值可以包含其他文档,数组及文档数组。 主要特点 # MongoDB 是一个面向文档存储的数据库,操作起来比较简单和容易。...文档中的键/值对是有序的。 # 2. 文档中的值不仅可以是在双引号里面的字符串,还可以是其他几种数据类型(甚至可以是整个嵌入的文档)。 # 3. MongoDB区分类型和大小写。 # 4....MongoDB的文档不能有重复的键。 # 5. 文档的键是字符串。除了少数例外情况,键可以使用任意UTF-8字符。 # 文档键命名规范: # 键不能含有\0 (空字符)。...MongoDB 中存储的文档必须有一个 _id 键。...这个键的值可以是任何类型的,默认是个 ObjectId 对象 由于 ObjectId 中保存了创建的时间戳,所以你不需要为你的文档保存时间戳字段,你可以通过 getTimestamp 函数来获取文档的创建时间
对于复合索引,MongoDB 可以使用索引来支持对索引前缀的查询。 多键索引:为了索引包含数组值的字段,MongoDB 为数组中的每个元素创建一个索引键。这些多键索引支持对数组字段的高效查询。...稀疏索引:只包含有索引字段的文档的条目,即使索引字段包含空值。索引会跳过任何缺少索引字段的文档。非稀疏索引包含集合中的所有文档,为那些不包含索引字段的文档存储空值。...config server:存储分片集的相关配置信息。 9.2 分片键 MongoDB 集合若要采用分片,必须要指定分片键(shard key)。分片键由文档中的一个或多个字段组成。...要对已填充的集合进行分片,该集合必须具有以分片键开头的索引;分片一个空集合时,如果该集合还没有包含指定分片键的索引,则 MongoDB 会默认给分片键创建索引。...如果查询不包含分片键,则 mongos 节点必须将查询定向到集群中的所有分片,然后在 mongos 上聚合所有分片的查询结果,返回给客户端。
writeConcern 看着是一种出错捕捉机制,搞清楚要干嘛再更新吧 ordered true:对数组中的文档执行有序插入,其中一个文档发生错误,MongoDB 将返回而不处理数组中的其余文档(默认...MongoDB 向集合里插入记录时,无须事先对数据存储结构进行定义,每个文档的数据结构都可以是不同的 如果待插入的集合不存在,则插入操作会默认创建集合 MongoDB 中,插入操作以单个集合为目标 MongoDB...中的所有写入操作都是单个文档级别的原子操作 插入不指定 _id 字段的文档 db.test.insert( { item : "card", qty : 15 }) MongoDB 会自动给它分配一个...插入指定 _id 字段的文档 值 _id 必须在集合中唯一,以避免重复键错误 db.test.insert( { _id: 10, item: "box", qty: 20 } ) db.test.find..._id 字段和一个 type 字段 第二个和第三个文档不包含 _id 字段 因此,在插入过程中,MongoDB 将会为第二个和第三个文档创建默认 _id 字段 db.test1.find() { "_
领取专属 10元无门槛券
手把手带您无忧上云