[mongo] 1.3 Documents(文档)

网友投稿 519 2022-05-29

MongoDB将数据记录存储为BSON文档。BSON是JSON文档的二进制表示形式,比JSON包含更多的数据类型。有关BSON规范,请参见bsonspec.org。另请参阅BSON类型。

文档结构

MongoDB文档由字段和值对( field-and-value)组成,并具有以下结构:

{ field1 : value1 , field2 : value2 , field3 : value3 , ... fieldN : valueN }

字段的值可以是任何BSON数据类型,包括其他文档,数组和文档数组。例如,以下文档包含各种类型的值:

var mydoc = { _id: ObjectId("5099803df3f4948bd2f98391"), name: { first: "Alan", last: "Turing" }, birth: new Date('Jun 23, 1912'), death: new Date('Jun 07, 1954'), contribs: [ "Turing machine", "Turing test", "Turingery" ], views : NumberLong(1250000) }

上面的字段具有以下数据类型:

_id拥有一个ObjectId。

name包含一个包含first和last字段 的嵌入式文档。

birth并death保留Date类型的值。

[mongo] 1.3 Documents(文档)

contribs持有字符串数组。

views拥有NumberLong类型的值。

Field名称

Field名称是字符串。

文档对字段名称有以下限制:

字段名称_id保留用作主键;它的值在集合中必须是唯一的,不可变的,并且可以是数组以外的任何类型。

字段名称不能包含null字符。

顶级字段名称不能以美元符号($)字符开头。

否则,从MongoDB 3.6开始,服务器允许存储包含点(即.)和美元符号(即 $)的字段名称。

重要

MongoDB查询语言不能总是有效地表达对字段名称包含这些字符的文档的查询(请参阅SERVER-30575)。

尽管支持在查询语句中添加$和 .,MongoDB的官方驱动程序不推荐也不支持在字段名称使用$和 .。

BSON文档可能有多个具有相同名称的字段。但是,大多数MongoDB接口使用不支持重复字段名称的结构(例如,哈希表)来表示MongoDB。如果需要处理具有多个同名字段的文档,请参见驱动程序的驱动程序文档。

通过内部的MongoDB进程创建的有些文件可能有重复的字段,但是没有MongoDB进程会不断地添加重复字段到现有的用户文档。

字段值限制

点 符号

MongoDB使用点符号访问访问数组的元素,访问嵌入式文档的字段。

数组(arrays)

要通过从零开始的索引位置指定或访问数组的元素,请将数组名称与点(.)和从零开始的索引位置连接起来,并用引号引起来:

"."

例如,给定文档中的以下字段:

{ ... contribs: [ "Turing machine", "Turing test", "Turingery" ], ... }

要指定contribs数组中的第三个元素,请使用点符号"contribs.2"。

有关查询数组的示例,请参见:

查询数组

查询嵌入式文档数组

另外

$[] 用于更新操作的所有位置运算符,

$[/] 过滤后的位置运算符,用于更新操作,

$ 用于更新操作的位置运算符,

$ 数组索引位置未知时的投影运算符

在数组中查询带数组的点表示法示例。

嵌入式文件

要使用点符号指定或访问嵌入式文档的字段,请将嵌入式文档名称与点(.)和字段名称连接在一起,并用引号引起来:

"."

例如,给定文档中的以下字段:

{ ... name: { first: "Alan", last: "Turing" }, contact: { phone: { type: "cell", number: "111-222-3333" } }, ... }

要指定在字段中命名last的name字段,请使用点符号"name.last"。

要在在phone文档中contact字段的number,请使用点号"contact.phone.number"。

有关查询嵌入式文档的示例,请参见:

查询嵌入/嵌套文档

查询嵌入式文档数组

文件限制

文档具有以下属性:

文件大小限制

BSON文档的最大大小为16 MB。

最大文档大小有助于确保单个文档不会使用过多的RAM或在传输过程中占用过多的带宽。要存储大于最大大小的文档,MongoDB提供了GridFS API。有关GridFS的更多信息,请参见mongofiles和驱动程序的文档。

文档字段顺序

除以下情况外,MongoDB会在执行写操作后保留文档字段的顺序:

该_id字段始终是文档中的第一个字段。

包含renaming字段名称的更新可能会导致文档中字段的重新排序。

_id段

在MongoDB中,存储在集合中的每个文档都需要一个唯一的 _id字段作为主键。如果插入的文档省略了该_id字段,则MongoDB会自动为该字段生成一个ObjectId_id。

这也适用于通过upsert:true通过更新操作插入的文档。

_id字段具有以下特性和约束:

默认情况,MongoDB_id在创建集合期间会在字段上创建唯一索引。

_id字段始终是文档中的第一个字段。如果服务器首先接收到没有该_id字段的文档,则服务器会将字段移到开头。

_id字段可以包含除数组以外的任何BSON数据类型的值。

警告

为确保复制正常进行,务必在_id 字段中存储BSON正则表达式类型的值。

以下是用于存储的值的常用选项_id:

使用一个ObjectId。

使用自然的唯一标识符(如果有)。这样可以节省空间并避免附加索引。

生成一个自动递增的数字。

在您的应用程序代码中生成一个UUID。为了在集合和_id 索引中更有效地存储UUID值,请将UUID存储为BSONBinData类型的值。

在以下情况下,BinData更有效地将类型为索引的键存储在索引中:

二进制子类型的值在0-7或128-135的范围内,并且

字节数组的长度为:0、1、2、3、4、5、6、7、8、10、12、14、16、20、24或32。

使用驱动程序的BSON UUID工具生成UUID。请注意,驱动程序实现可能会以不同的方式实现UUID序列化和反序列化逻辑,这可能与其他驱动程序不完全兼容。请参阅您的驱动程序文档,以获取有关UUID互操作性的信息。

注意

大多数MongoDB驱动程序客户端将包括该_id字段并ObjectId在将插入操作发送到MongoDB之前生成一个;但是,如果客户发送的文档中没有_id 字段,mongod则会添加该_id字段并生成ObjectId。

数据结构的其他用途

除了定义数据记录外,MongoDB还在整个文档结构中使用,包括但不限于:查询过滤器,更新规范文档和索引规范文档

查询过滤器

查询过滤器文档指定确定用于选择哪些记录以进行读取,更新和删除操作的条件。

您可以使用:表达式来指定相等条件和查询运算符 表达式。

{ : , : { : }, ... }

有关示例,请参见:

查询文件

查询嵌入/嵌套文档

查询数组

查询嵌入式文档数组

更新规范文件

更新规范文档使用更新运算符来指定要在db.collection.update()操作期间在特定字段上执行的数据修改。

{ : { : , ... }, : { : , ... }, ... }

有关示例,请参阅更新规范。

索引规范文档

索引规范文档定义了要索引的字段和索引类型:

{ : , : , ... }

Further Reading

For more information on the MongoDB document model, download the MongoDB Application Modernization Guide.

The download includes the following resources:

Presentation on the methodology of data modeling with MongoDB

White paper covering best practices and considerations for migrating to MongoDB from an RDBMS data model

Reference MongoDB schema with its RDBMS equivalent

Application Modernization scorecard

MongoDB 云数据库 GaussDB(for Mongo) 数据库

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:《Spark数据分析:基于Python语言 》 —1.1.2 Hadoop简介
下一篇:文档代码同源
相关文章