MongoDB(5)- Document 文档相关

简介: MongoDB(5)- Document 文档相关

Documents


  • MongoDB 的文档可以理解为关系型数据库(Mysql)的一行记录
  • MongoDB 将数据记录为 BSON 格式的文档
  • BSON 是 JSON 文档的二进制表示,但它支持的数据类型更加丰富(下一篇文章讲到)


image.png


Documents 的结构


由键值对组队(字段名:值)

{
   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 类型的值
  • contribs:字符串数组
  • views:NumberLong 类型的值

 

字段名


首先必须是字符串,除此之外还有以下限制

 

字段名不能包含 null 字符

 

字段名为_id

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

 

最高一级的字段名不能包含 $ 字符

不过,从 MongoDB 3.6 开始,允许存储包含 .$ 符号的字段

 

字段的一些限制

  • 键名区分大小写;
  • 键的值区分类型(如字符串和整数等)

 

栗子一

以下两组文档是不同的,因为值的类型不同

{"recommend":"5"}

{"recommend":5}

 

栗子二

以下两组文档也是不同的,因为键名是区分大小写的

{ "Recommend" : " 5 "}

{"recommend":"5"}

 

关于一个文档里面的同名字段


  • BSON文档可能有多个同名字段
  • 但是大多数 MongoDB 接口用不支持重复字段名的结构(例如哈希表)表示MongoDB
  • 如果需要操作具有多个同名字段的文档,需要查看 driver 驱动相关的文档(后续介绍)
  • 一些由内部 MongoDB 进程创建的文档可能有重复的字段,但是没有 MongoDB 进程会将重复的字段添加到现有的用户文档中

 

访问文档


跟访问 python 的字典一样,都是 .

 

访问文档里面的数组


"<array>.<index>"

 

数组小栗子

假设有一个文档,想取 contribs 字段的第三个值

{

  ...

  contribs: [ "Turing machine", "Turing test", "Turingery" ],

  ...

}

 

正确做法

contribs.2


更多查询数组字段的方法后面展开详解

 

访问文档里面的嵌套文档


"<embedded document>.<field>"

 

嵌套文档小栗子

{

  ...

  name: { first: "Alan", last: "Turing" },

  contact: { phone: { type: "cell", number: "111-222-3333" } },

  ...

}

 

正确做法

name.last

contact.phone.type

更多嵌套查询的方法后面展开详解

 

字段值的限制


对索引字段的最大长度有限制(后面更新文章再更新这里)

 

文档的限制


文档大小限制

  • 最大 BSON 文档大小为 16 mb
  • 最大文档大小有助于确保单个文档不能使用过多的内存,或者在传输过程中不能占用过多带宽
  • 为了超过最大大小限制的文档,MongoDB 也提供了 GridFS(后续再讲)

 

文档字段顺序

默认情况下,MongoDB 在写操作后保留文档字段的顺序,但以下情况除外

  • _id 字段永远都是第一个字段
  • 重命名字段名的更新可能会导致文档中字段的重新排序

 

_id 字段


  • 在 MongoDB 中,存储在集合中的每个文档都需要一个唯一的 _id 字段作为主键
  • 如果新插入的文档没有指定 _id 字段,那么 MongoDB 会自动为它生成一个 ObjectID(上面的截图其实也能看到)
  • 第二条同样适用通过 upsert:true 的更新操作(后续再讲)

 

存储 _id 值的常用选项

  • 使用 ObjectId
  • 使用自然唯一标识符(如果可用),这样可以节省空间并避免额外的索引
  • 生成一个自动递增的数字
  • 在应用程序代码中生成 UUID,为了更有效地存储集合和索引中的UUID值,将 UUID 存储为 BSON BinData类型的值
  • 如果满足以下条件,则 BinData 类型的索引键将更有效地存储在索引中:
  • 二进制子类型值在0-7或128-135之间,并且
  • 字节数组的长度为:0、1、2、3、4、5、6、7、8、10、12、14、16、20、24或32。
  • 使用驱动程序的BSON UUID工具生成UUID。

 



相关文章
|
11月前
|
NoSQL MongoDB 微服务
微服务——MongoDB常用命令——文档的分页查询
本文介绍了文档分页查询的相关内容,包括统计查询、分页列表查询和排序查询。统计查询使用 `count()` 方法获取记录总数或按条件统计;分页查询通过 `limit()` 和 `skip()` 方法实现,控制返回和跳过的数据量;排序查询利用 `sort()` 方法,按指定字段升序(1)或降序(-1)排列。同时提示,`skip()`、`limit()` 和 `sort()` 的执行顺序与编写顺序无关,优先级为 `sort()` &gt; `skip()` &gt; `limit()`。
394 1
|
11月前
|
JSON NoSQL MongoDB
微服务——MongoDB常用命令——文档基本CRUD
本文介绍了MongoDB中文档的基本操作,包括插入、查询、更新和删除。单个文档插入使用`insert()`或`save()`方法,批量插入用`insertMany()`。查询所有文档用`find()`,条件查询可在`find()`中添加参数,投影查询控制返回字段。更新文档通过`update()`实现,支持覆盖修改、局部修改(使用`$set`)和批量修改。列值增长可用`$inc`实现。删除文档用`remove()`,需谨慎操作以免误删数据。此外,文档键值对有序,区分大小写,不能有重复键。
254 1
|
NoSQL MongoDB 数据库
MongoDB 更新文档
10月更文挑战第14天
341 2
|
存储 NoSQL MongoDB
数据的存储--MongoDB文档存储(二)
数据的存储--MongoDB文档存储(二)
333 2
|
存储 监控 NoSQL
【赵渝强老师】MongoDB文档级别的并发控制
MongoDB使用WiredTiger存储引擎在文档级别进行并发控制,允许多个写操作同时修改不同文档,但对同一文档的修改需序列化执行。引擎采用乐观锁和意向锁机制处理冲突。通过视频讲解、插入大量文档示例及使用`mongotop`和`db.serverStatus()`命令,演示了如何监控MongoDB的锁信息和读写统计,展示了数据库和集合级别的写锁情况。
333 29
|
SQL NoSQL MongoDB
MongoDB 查询文档
10月更文挑战第15天
557 1
|
存储 NoSQL 关系型数据库
数据的存储--MongoDB文档存储(一)
数据的存储--MongoDB文档存储(一)
682 3
|
NoSQL MongoDB
MongoDB 删除文档
10月更文挑战第15天
330 0
|
存储 JSON NoSQL
MongoDB 插入文档
10月更文挑战第14天
564 0

推荐镜像

更多