Documents

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

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 开始,允许存储包含 . 和 $ 符号的字段

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

  • 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。

最新文章

  1. clang_intprt_t类型探究
  2. ArcGIS中的VBA修复
  3. Senparc.Weixin.MP SDK 微信公众平台开发教程(七):解决用户上下文(Session)问题
  4. JavaScript中使用typeof运算符需要注意的几个坑
  5. 微信token验证失败的解决方法
  6. arcgis desktop按ctrl键后地图乱移的解决办法
  7. 文件与目录的默认权限与隐藏权限【转vbird】
  8. 你以为你真的会用编辑器----之Vim
  9. spring定时任务执行两次 项目重复初始化 项目启动两次
  10. Node.js的下载、安装、配置、Hello World、文档阅读
  11. nodejs 全局变量
  12. kettle在本地执行向远程hdfs执行转换错误&quot;Couldn&#39;t open file hdfs&quot;
  13. Javaweb学习笔记——(七)——————myexlipse基本使用、jdk5.0新特性及反射讲解
  14. eclipse显示xml提示
  15. mongodb $用法,等
  16. EF CodeFirst学习笔记003--如何创建表
  17. kafka中处理超大消息的一些处理
  18. [转]关于vs2005、vs2008和vs2010项目互转的总结
  19. 2018年美国大学生数学建模竞赛(MCM/ICM) B题解题思路
  20. 003_Mac挂载NTFS移动硬盘读取VMware虚拟机文件

热门文章

  1. S-Trees UVA - 712
  2. 什么是SQL注入漏洞?
  3. 关于Spring Boot 多数据源的事务管理
  4. C/C++ 实现多线程与线程同步
  5. windows内核开发环境的简易搭建
  6. 两种常见的Vlan间通信的方式
  7. 内核模式下的线程同步的分析(Windows核心编程)
  8. http预请求options
  9. apache common pool2原理与实战
  10. 面向对象JML系列作业总结