温馨提示×

mongodb以哪种格式表示文档结构

小晨
217
2021-07-19 10:22:44
栏目: 云计算

mongodb以BSON格式表示文档结构,它是一个基于分布式文件存储的开源数据库系统,它的特点是高性能、易部署、易使用,存储数据非常方便。

mongodb以哪种格式表示文档结构

具体内容如下:

文档是 MongoDB 的核心概念,是数据的基本单元,与关系数据库中的行十分类似,但是比行要复杂。文档是一组有序的键值对集合。文档的数据结构与 JSON 基本相同,所有存储在集合中的数据都是 BSON 格式。

BSON 是一种类 JSON 的二进制存储格式,是 Binary JSON 的简称。 一个简单的文档例子如下:

{"country" : "China", "city": "BeiJing"}

MongoDB 中的数据具有灵活的架构,集合不强制要求文档结构。但数据建模的不同可能会影响程序性能和数据库容量。文档之间的关系是数据建模需要考虑的重要因素。文档与文档之间 的关系包括嵌入和引用两种。

下面举一个关于顾客 patron 和地址 address 之间的例子,来说明在某些情况下,嵌入优于引用。

{

    _id: "joe",

    name: "Joe Bookreader"

}

{

    patron_id: "joe",

    street: "123 Fake Street",

    city: "Faketon",

    state: "MA",

    zip: "2345"

}

关系数据库的数据模型在设计时,将 patron 和 address 分到两个表中,在查询时进行关联, 这就是引用的使用方式。如果在实际查询中,需要频繁地通过 _id 获得 address 信息,那么就需要频繁地通过关联引用来返回查询结果。在这种情况下,一个更合适的数据模型就是嵌入。

将 address 信息嵌入 patron 信息中,这样通过一次查询就可获得完整的 patron 和 address 信息,如下所示:

{

    _id: "joe",

    name: "Joe Bookreader",

    address: {

        street: "123 Fake Street",

        city: "Faketon”,

        state: nMAnz

        zip: T2345”

    }

}

如果具有多个 address,可以将其嵌入 patron 中,通过一次查询就可获得完整的 patron 和多个 address 信息,如下所示:

{

    _id: "joe",

    name: "Joe Bookreader",

    addresses:[

        {

            street: "123 Fake Streetn,

            city: "Faketon",

            state: "MA",

            zip: "12345"

        },

        {

            street: "l Some Other Street",

            city: "Boston",

            state: "MA",

            zip: "12345"

        }

    ]

}

但在某种情况下,引用用比嵌入更有优势。下面举一个图书出版商与图书信息的例子,代码如下:

{

    title: "MongoDB: The Definitive Guide",

    author: [ "Kristina Chodorow", "Mike Dirolfn"],

    published_date: ISODate("2010-09-24"),

    pages: 216,

    language: "English",

    publisher: {

        name: "O'Reilly Media",

        founded: 1980,

        location: "CA"

    }

}

{

    title: "50 Tips and Tricks for MongoDB Developer",

    author: "Kristina Chodorow",

    published_date: ISODate("2011-05-06"),

    pages: 68,

    language: "English",

    publisher: {

        name: "O'Reilly Media",

        founded: 1980,

        location: "CA"

    }

}

从上边例子可以看出,嵌入式的关系导致出版商的信息重复发布,这时可采用引用的方式描述集合之间的关系。使用引用时,关系的增长速度决定了引用的存储位置。如果每个出版商的图书数量很少且增长有限,那么将图书信息存储在出版商文档中是可行的。

通过 books 存储每本图书的 id 信息,就可以查询到指定图书出版商的指定图书信息,但如果图书出版商的图书数量很多, 则此数据模型将导致可变的、不断增长的数组 books,如下所示:

{

    name: "O'Reilly Media",

    founded: 1980,

    location: "CA",

    books: [123456789, 234567890, …]

}

{

    _id: 123456789,

    title: "MongoDE: The Definitive Guide",

    author: ["Kristina Chodorow", "Mike Dirolf"],

    published_date: ISODate("2010-09-24"),

    pages: 216,

    language: "English"

}

{

    _id: 234567890,

    title: "50 Tips and Tricks for MongoDB Developer",

    author: "Kristina Chodorow",

    published_date: ISODate("2011-05-06"),

    pages: 68,

    language: "English"

}

为了避免可变的、不断增长的数组,可以将出版商引用存放到图书文档中,如下所示:

{

    _id: "oreilly",

    name: "O'Reilly Media",

    founded: 1980,

    location: "CA"

}

{

    _id: 123456789,

    title: "MongoDB: The Definitive Guiden,

    author: [ "Kristina Chodorow", "Mike Dirolf"],

    published_date: ISODate("2010-09-24"),

    pages: 216,

    language: "English",

    publisher_id: "oreilly"

}

{

    _id: 234567890,

    title: "50 Tips and Tricks for MongoDB Developer",

    author: "Kristina Chodorow",

    published date: ISODate("2011-05-06"),

    pages: 68,

    language: "English",

    publisher_id: "oreilly"

}

0