我们如何引用 MongoDB 中的集合?

Gok*_*mar 5 mongodb database-design mongodb-3.6

这是我在这个论坛上的第一篇文章。我有 RDBMS 背景,想学习 MongoDB,这将帮助我将应用程序迁移到 MongoDB。我正在创建两个集合(客户和地址)。

客户收藏

具有姓名、性别、城市、国家、电话、地址等通用信息(应引用另一个集合)。

地址采集

有一系列信息,如当前地址、办公室地址、邮寄地址。我想知道如何添加对另一个集合的引用?考虑到这种情况,客户集合将有一个地址文档,该文档必须包含对地址集合中 id 的引用。

如果有人能给我提供这个模型的示例。这会很棒。先感谢您。

Md *_*han 4

\n

我想知道如何添加对另一个集合的引用?

\n
\n\n

关系MongoDB表示各种文档如何在逻辑上相互关联。可以通过嵌入式和引用方法对关系进行建模。这种关系可以是1:1, 1:N,N:1N:N

\n\n

Modeling Referenced Relationships通过和是可能的DBRefs

\n\n

在这里我要讨论的是Modeling Referenced Relationships.

\n\n

让我们考虑一下存储客户地址的情况。因此,一个客户可以拥有多个地址,从而形成1:N 关系

\n\n

以下是客户文档的示例文档结构

\n\n
{\n"_id":ObjectId("52ffc33cd85242f436000001"),\n   "name": "Gokulnath Kumar",\n   "gender": "Male",\n   "city": "Doha",\n   "country": "Qatar",\n   "Phone": "777 95057",\n   "address": "100A, Doha,Qatar"\n})\n
Run Code Online (Sandbox Code Playgroud)\n\n

以下是地址文档\xe2\x88\x92的示例文档结构

\n\n
{\n"_id":ObjectId("52ffc4a5d85242602e000000"),\n   "address": "100A, Doha,Qatar",\n   "office address": " 200B, Doha Qatar",\n   "mailing address": "abc@gmail.com"\n} \n
Run Code Online (Sandbox Code Playgroud)\n\n

首先,我将在这里写下来Modeling Embedded Relationships,以便您更好地理解。即使@JJussi已经告诉我们,我们可以通过modeling Embedded Relationship.

\n\n
\n

注意:缺点是如果嵌入文档的大小持续增长过多,可能会影响读/写性能。

\n
\n\n

嵌入式关系建模

\n\n

输入的数据MongoDB具有灵活的模式。集合不强制文档结构。影响数据建模方式的决策会影响应用程序性能和数据库容量。

\n\n

本文档描述了一个数据模型,该模型使用嵌入文档来描述连接数据之间的关系。

\n\n

如果您的应用程序经常检索带有名称信息的地址数据,那么您的应用程序需要发出多个查询来解析引用。更优化的模式是将地址数据实体嵌入到客户数据中,如以下文档所示:

\n\n
{\n"_id":ObjectId("52ffc33cd85242f436000001"),\n    "name": "Gokulnath Kumar",\n   "gender": "Male",\n   "city": "Doha",\n   "country": "Qatar",\n   "Phone": "777 95057",\n   "address": [\n{\n"address": "100A, Doha,Qatar",\n   "office address": " 200B, Doha Qatar",\n   "mailing address": "abc@gmail.com"\n}]}\n
Run Code Online (Sandbox Code Playgroud)\n\n

然后对引用关系进行建模

\n\n

这就是设计的思路normalized relationship。在此方法中, 和customer文档address将单独维护,但客户文档将包含一个引用文档addressid field.

\n\n
{\n   "_id":ObjectId("52ffc33cd85242f436000001"),\n   "name": "Gokulnath Kumar",\n   "gender": "Male",\n   "city": "Doha",\n   "country": "Qatar",\n   "Phone": "777 95057",\n   "address_ids": [\n      ObjectId("52ffc4a5d85242602e000000"),\n      ObjectId("52ffc4a5d85242602e000001")\n   ]\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

如上所示,客户文档包含数组字段address_ids,其中包含相应地址的ObjectId。使用这些 ObjectId,我们可以查询地址文档并从中获取地址详细信息。使用这种方法,我们将需要两个查询:首先从客户文档中获取 address_ids 字段,其次从地址集合中获取这些地址。

\n\n
>var result = db.customer.findOne({"name":"Gokulnath Kumar"},{"address_ids":1})\n>var addresses = db.address.find({"_id":{"$in":result["address_ids"]}})\n
Run Code Online (Sandbox Code Playgroud)\n\n

如需进一步参考,请参阅此处此处此处

\n