MongoDB数据模型(三)

六、数据模型引用

文档

我们已经知道MongoDB以文档的形式存储数据,而文档是JSON风格的数据结构,由一系列的“字段名-值”对组成,如下所示

{ "item": "pencil", "qty": 500, "type": "no.2" }

大多用户可访问的数据结构是文档,这些文档可以表示很多含义,包括:

  • 所有数据库记录。
  • 查询选择器,定义选择什么样的记录用以读取、更新和删除操作。
  • 更新定义,定义需要修改哪些字段。
  • 索引指定,定义对哪些字段加索引。
  • 用于MongoDB报道以及配置的数据输出,例如serverStatus的输出和复制集配置文档。

文档格式

MongoDB在磁盘上以BSON的序列化格式存储文档。BSON就是JSON文档的二进制表现,尽管BSON包含了比JSON更多的数据类型。

mongo的JavaScript脚本与MongoDB语言驱动器用于在BSON和语言有关的文档表现形式之间转换。

文档结构

文档的形式如下

{
   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)
            }

数据库引用

因为MongoDB的文档结构自由灵活不固定,所以这使得MongoDB不支持连接操作。数据去规范化存储,或者存储有关的数据到文档中,可以免去对连接的需要,当然这有可能导致有关的信息被存储在不同的文档中,而且通常这些文档位于不同的集合甚至不同的数据库中。

MongoDB的应用程序如要将不同的文档联系起来,可以使用以下两种方法中的一种:

  • 手动引用,在一个文档中存储另一个文档的_id字段。这样,应用程序可以使用一个二次查询来返回需要的数据。这些引用在大多数情况下都很简单并且足够用。
  • DBRefs,一个文档中引用另一个文档,引用内容包括:被引用的文档的_id字段,集合名,甚至还可以有数据库名。通过包含这些名称,DBRefs可以用一个集合中的文档简单方便地与位于其他集合中的文档联系起来。为了解析DBRefs,程序也需要执行额外的查询才能得到被引用的文档。很多驱动都有一些帮助方法来自动为DBRef生成查询,不过驱动不会自动解析DBRefs生成文档(一些社区支持的驱动可以切换行为从而有可能可以自动解析DBRef为文档)。DBRefs提供一个通过的格式和类型来表征文档间的关系。如果数据库必须与多个框架和工具进行交互,那DBRefs格式也提供表征文档之间的联系的通用语义。

手动引用

考虑如下示例,使第一个文档的_id字段作为第二个文档的引用

original_id = ObjectId()

db.places.insert({
    "_id": original_id,
    "name": "Broadway Center",
    "url": "bc.example.net"
})

db.people.insert({
    "name": "Erin",
    "places_id": original_id,
    "url":  "bc.example.net/Erin"
})

这样,一个查询从people集合中返回后,就可以跟进返回结果中的places_id字段值对places集合做第二个查询。

手动引用是非常简单的,解析引用也是决定于程序是否需要。

DBRefs

DBRefs约定是表征一个文档,而非一个特定的引用类型。DBRefs除了包含_id字段值,还包含集合名,某些情况下还包括数据库名。

格式如下:

$ref:字段保持着被引用的文档所在集合的名称

$id:包含了被引用文档的_id字段值

$db:这是一个可选项。包含了被引用文档所在数据库的名称,注意仅部分驱动支持$db引用。

{ "$ref" : <value>, "$id" : <value>, "$db" : <value> }

示例,考虑一个文档,其在creator字段中存储了DBRef

{
  "_id" : ObjectId("5126bbf64aed4daf9e2ab771"),
  // .. application fields
  "creator" : {
                  "$ref" : "creators",
                  "$id" : ObjectId("5126bc054aed4daf9e2ab772"),
                  "$db" : "users"
               }
}

注意,通常来说,使用手动引用就可以了,如果需要引用多个集合中的文档,则考虑使用DBRefs。

时间: 2024-10-05 09:30:51

MongoDB数据模型(三)的相关文章

mongodb学习(三)

菜鸟啊...先吐槽一下自己 一 准备工作: 1.安装服务端: 去官网下载 http://www.mongodb.org/downloads 其实也自带了客户端 shell 2.安装客户端: mongoVUE http://blog.mongovue.com/ 并不是完全免费 破解方法: http://yhv5.com/mongovue_480.html 将服务端下载下来后直接安装 我下载在D盘也安装在D盘的... 启动mongodb的服务端不需要各种命令....直接鼠标左键双击bin中的mong

第二课 MongoDB 数据模型

1.课程大纲 本课程主要介绍MongoDB数据模型相关知识.包含文档.集合与数据库的基本概念.用法及命名规则:MongoDB主要的数据类型介绍以及MongoDB Shell的简单介绍与使用. 文档 (Document) 与 集合 MongoDB 数据类型 MongoDB Shell简单介绍与使用 2.课程简单介绍 本课时将解说 MongoDB 数据类型,首先会对 MongoDB 数据类型做一个简单介绍.然后会对当中几个比較重要的同一时候也是我们在实际项目中常常使用到的数据类型做一个具体介绍,这些

MongoDB数据模型和索引学习总结

MongoDB数据模型和索引学习总结 1. MongoDB数据模型: MongoDB数据存储结构: MongoDB针对文档(大文件採用GridFS协议)採用BSON(binary json,採用二进制编码)数据格式来存储和交换数据.Bson吸收了JSON schema-less的特点,存储结构松散,不须要像RDB(关系数据)那样事先定义数据存储的元数据结构.另外添加了多种数据类型的支持和优化,使读写更加高效. (1) BSON 支持的数据类型: Double.String.Object.Arra

【转载】8天学通MongoDB——第三天 细说高级操作

今天跟大家分享一下mongodb中比较好玩的知识,主要包括:聚合,游标. 一: 聚合 常见的聚合操作跟sql server一样,有:count,distinct,group,mapReduce. <1> count count是最简单,最容易,也是最常用的聚合工具,它的使用跟我们C#里面的count使用简直一模一样. <2> distinct 这个操作相信大家也是非常熟悉的,指定了谁,谁就不能重复,直接上图. <3> group 在mongodb里面做group操作有点

MongoDB数据模型(二)

原文地址 接上一篇 四.模型树结构 父引用的模型树结构 这个数据模型描述了一个树形结构,在子节点中存储父节点的引用. 模式 父引用模式存储每个树节点到文档中,除了树节点外,文档还存储了父节点的id. 考虑以下目录的层级关系. 以下为应用实例 db.categories.insert( { _id: "MongoDB", parent: "Databases" } ) db.categories.insert( { _id: "dbm", pare

MongoDB数据模型

MongoDB中的数据有一个灵活的模式.不像SQL数据库,你必须确定在插入数据之前和声明一个表的模式, MongoDB的集合不执行文档结构.他灵活便利的映射文件一个实体或对象.每个文档可以匹配的数据字段代表的实体, 即使数据有实质性的变化.然而在实践中,集合中的文件共享一个相似的结构.数据建模的关键挑战是平衡应用程序 的需要,数据库引擎的性能特征,数据检索模式.在设计数据模型时,总是考虑应用程序使用的数据(如查询.更新和处 理的数据)以及数据本身固有的结构. 文档结构 MongoDB应用程序的数

【MongoDB】学习MongoDB推荐三本书

最近学习mongodb,感觉这三本书写得不错,很大家分享一下:

MongoDB (四) MongoDB 数据模型

在 MongoDB 中的数据有灵活的模式.在相同集合中文档并不需要有相同的一组字段或结构的公共字段的集合,文档可容纳不同类型的数据. MongoDB设计模式的一些考虑 可根据用户要求设计架构. 合并对象为一个文件,如果要将它们放在一起.否则分开它们(但确保不需要连接). 重复数据(有限),因为磁盘空间便宜(相比计算时间). 不需要连接写入,而是读. 优化架构是最常见的用例. 在模式上做复杂的聚集. 例子 假设一个客户端需要一个数据库设计,设计一个博客网站,来看看 RDBMS 和 MongoDB

Mongodb(三)Mongodb复制和分片

(一)MongDB复制(副本集)MongDB复制是将数据同步到多个服务器的过程.复制提供了数据的冗余备份,并在服务器上存储数据副本,提高数据的可用性,保证数据的安全性,复制允许你从硬件和服务的中断中恢复数据,能随时应对数据丢失.机器损坏带来的风险.而且复制还能提高读取能力,用户读取服务器和写入服务器在不同的地方,提高整个系统的负载. 1.复制的特性: 保障数据的安全性 数据的高可用性7*24 灾难恢复 无需停机维护 分布式读取数据 2.复制的原理 Mongodb复制集由一组Mongod实例(进程