六、数据模型引用

文档

我们已经知道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。

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

  1. 我的Android进阶之旅------>Android疯狂连连看游戏的实现之状态数据模型(三)

    对于游戏玩家而言,游戏界面上看到的"元素"千变万化:但是对于游戏开发者而言,游戏界面上的元素在底层都是一些数据,不同数据所绘制的图片有所差异而已.因此建立游戏的状态数据模型是实现游 ...

  2. 第二课 MongoDB 数据模型

    1.课程大纲 本课程主要介绍MongoDB数据模型相关知识.包含文档.集合与数据库的基本概念.用法及命名规则:MongoDB主要的数据类型介绍以及MongoDB Shell的简单介绍与使用. 文档 ( ...

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

    MongoDB数据模型和索引学习总结 1. MongoDB数据模型: MongoDB数据存储结构: MongoDB针对文档(大文件採用GridFS协议)採用BSON(binary json,採用二进制 ...

  4. MongoDB数据模型(一)

    原文地址 一.数据模型介绍 MongoDB中的数据有着灵活的架构.与SQL数据库不同,因为SQL数据库必须先定义表结构,然后才能向其中插入数据,而MongoDB的集合不强制任何文档结构.这个灵活性方便 ...

  5. MONGODB(三)——Java操作Mongo

    相比于java调用MySqlApI来操作数据库,调用Mongo要简洁容易的多.通过一个简单的样例,很容易地就可以上手 一.导入Jar包 添加Monog支持Java的jar包,这里使用的是2.9.3 & ...

  6. MongoDB (四) MongoDB 数据模型

    在 MongoDB 中的数据有灵活的模式.在相同集合中文档并不需要有相同的一组字段或结构的公共字段的集合,文档可容纳不同类型的数据. MongoDB设计模式的一些考虑 可根据用户要求设计架构. 合并对 ...

  7. MongoDB入门三步曲2--基本操作(续)--聚合、索引、游标及mapReduce

    mongodb 基本操作(续)--聚合.索引.游标及mapReduce 目录 聚合操作 MapReduce 游标 索引 聚合操作 像大多关系数据库一样,Mongodb也提供了聚合操作,这里仅列取常见到 ...

  8. MongoDB入门三步曲1--安装、基本操作

    mongodb 基本操作 目录 mongodb安装 mongod启动 mongo shell启动 mongod 停止 mongodb基本操作:CRUD 数据插入 数据查询 数据更新 数据删除 集合删除 ...

  9. 【MongoDB】学习MongoDB推荐三本书

    近期学习mongodb,感觉这三本书写得不错.非常大家分享一下:

随机推荐

  1. lamda 表达式

    Lamda 表达式 高阶语言中的lamda表达式, 灵感来自于lamda演算.lamda演算包括一条变换规则 (变量替换) 和一条函数定义方式, 通过带入和替换, 对输入产生输出. Connect 新 ...

  2. [MFC美化] SkinMagic使用详解1- SkinMagic使用流程

    [SkinMagic使用流程] 1.工程配置SkinMagic相关文件 2.初始化SkinMagic皮肤文件,窗体加载皮肤 3.释放皮肤资源 特别声明,SkinMagic要是破解版的,如果不是,可能需 ...

  3. 为jEasyUi的日期控件添加一个“清空”按钮----通过修改1.4的easyui.min.js

    为 jQuery EasyUI 1.4 的datebox或datetimebox添加一个清空按钮 使用场景:为用户指定了日期的格式,且日期可以为空 修改语言包easyui-lang-zh_CN.js ...

  4. C++第二天

    今天学会了反码和补码: 1.正数的反码是本身,负数的反码是高位不变,其余位取反(这里的数是指二进制数) 2.补码是反码加一得到的 对于数据类型分为基本类型:整型,浮点型,字符型和布尔值类型,还有飞基本 ...

  5. CodeForces 710C Magic Odd Square

    构造. 先只考虑用$0$和$1$构造矩阵. $n=1$,$\left[ 1 \right]$. $n=3$,(在$n=1$的基础上,最外一圈依次标上$0$,$1$,$0$,$1$......) $\l ...

  6. VR行业未来是会走向巅峰还是会归于落寞?

    日前591ARVR资讯网www.591arvr.com根据有关市场调研机构的权威数据分析进行预测表明,全球VR头显出货量将达到1.3亿部,但是现在市场数字不过年出货1700万部,这一部分VR并不指的是 ...

  7. LINQ_to_SQL语法及实例大全

    LINQ To SQL 语法及实例大全 2011/4/5 目录 LINQ to SQL语句(1)之Where. 2 Where操作... 2 1.简单形式:... 2 2.关系条件形式:... 2 3 ...

  8. sharepoint:各种阀值

    //来源:http://www.cnblogs.com/jindahao/archive/2012/04/25/2469791.html 引用自JonyZhu,如下: 技术参数 值 列表最大记录数 5 ...

  9. C#拾遗(二、函数)

    1. 参数数组.C#的特色,允许函数参数的最后指定一个参数数组,可以使用个数不定的参数调用,用params关键字定义 static double SumVals(params double[] val ...

  10. Jenkins2.32.1+svn+maven安装配置与构建部署

    这两天学习了一下持久化集成工具Jenkins,在自己的本地搭建一个简单的Jenkins环境. 使用环境:Windows64系统,JDK1.8,eclipse,svn(Windows版本VisualSV ...