在传统的SQL数据库中,关系被分为一个个表(table),在表中,每个数据项以主键(primary key)标识,而一个表的主键又作为另一个表的外键(reference key),在两个表之间引用。当遇上多对多关系的时候,还需要一个额外的关联表(reference table),将多对多关系转化成两个一对多关系。

而在MongoDB中,表示关系有两种办法:

一种是嵌套(embedded),既是将一个文档包裹一个子文档;

而另一种是引用链接(reference link),使用MongoDB的DBRef对象建立文档和文档之间的关系。

除此之外,MongoDB的关系比起传统的SQL表关系更丰富一些,可以有 1对1 , 1对N , N对1 和 N对N 几种关系。

本文的目的就是探讨MongoDB表示关系的方法。

首先,让我们来看看MongoDB表示数据关系的两种方式:嵌套和引用链接。

嵌套

每个MongoDB文档都由BSON文档组成,有类似JSON格式一样的数据类型,其中String、Int、Float称为基本类型(或常量),而Hash和Array称之为复合类型。

所谓的嵌套,就是说文档中,利用复合类型,包裹一个多或多个其他类型的值,这些值称之为子文档。

文档嵌套的数量和深度没有限制,但MongoDB目前版本限制一个文档最大为16MB。

mongodb嵌套文档 mongodb像sql那样嵌套_5e


嵌套的好处是显而易见的:嵌套文档维持了数据逻辑上的完整性,可以将一整项数据作为一个整体来操纵。

引用链接

比起嵌套,引用链接更接近传统意义上的(也就是,关系型数据库术语中的)“引用”,它是两个文档之间的一种关系。

引用链接通过DBRef对象建立,DBRef对象储存了如何找到目标文档的信息,就像现实世界中的门牌号码一样(也类似关系型数据库中的外键)。

如果在一个文档A中,有一个DBRef对象,而这个DBRef对象储存了关于如何找到文档B的信息,那么文档A就可以通过解释这个DBRef对象(称之为解引用)来获取文档B的数据。

{ 
    "_id" : ObjectId("5e9549b0dd3d0962948db12e"), 
    "items" : [
        {
            "_id" : ObjectId("5e9549b0dd3d0962948db12f"), 
            "url" : "www.baidu.com", 
            "image" : "http://localhost:3000/uploads/c654379b3f22597ab1c0b21afe7c762c"
        }, 
        {
            "_id" : ObjectId("5e9549b0dd3d0962948db130"), 
            "url" : "www.taobao.com", 
            "image" : "http://localhost:3000/uploads/b74349333433dc4191d4a1bf08ab3054"
        }, 
        {
            "_id" : ObjectId("5e9549cedd3d0962948db133"), 
            "url" : "www.jd.com", 
            "image" : "http://localhost:3000/uploads/0ba086dbb86e697b32099ec2e3ad3bf3"
        }, 
        {
            "_id" : ObjectId("5e9549cedd3d0962948db134"), 
            "url" : "www.codeting.com", 
            "image" : "http://localhost:3000/uploads/a801aecb7f96da3ad5482d394519c12d"
        }, 
        {
            "_id" : ObjectId("5e966796d93e1adc2ca90a03"), 
            "url" : "www.baidu.com", 
            "image" : "http://localhost:3000/uploads/8aac137945eda3ba5283c964dfeaa0aa"
        }
    ], 
    "name" : "首页", 
    "__v" : NumberInt(0)
}