MongoDB中的子结构与平面数据结构 - NoSQL

问题描述 投票:1回答:1

我试图了解如何最好地构建MongoDB模式,因此寻找指导,尤其是使用子结构(嵌入式文档)与平面数据结构。

我们假设我们想在MongoDB中存储一个用户帐户。用户只有一个地址,因此我们可以选择以下两种结构之一:

{ 
_id: String,
username: String,
firstname: String,
surname: String,
email: String,
street: String,
city String,
zip: Number,
}

要么

{
_id: String,
name: {
    first: String,
    last: String,
    }
email: String,
address: {
    street: String,
    city String,
    zip: Number,
    }
}

每种结构的优点/缺点是什么?是否有规则何时使用子结构或何时使用扁平结构?一个人对另一个人的理由是什么?

先感谢您!

mongodb data-structures nosql data-modeling
1个回答
0
投票

MongoDB中提供了各种数据建模模式和模式设计。我将分享我遇到的问题以及不同数据库模式的好处。我们将在下面逐一讨论:

  1. 嵌入式VS平面数据结构:在这种情况下,两种模式之间没有太大差异,但是在嵌入式数据模型的情况下,我们将相似类型的数据分组,这样您的查询就会变得简单或小巧。来自任何集合的$ project数据。 例如:如果要获取完整地址,那么在嵌入式doc的情况下,您不需要单独$ project地址字段,如果要在获取文档时跳过地址字段,则不需要单独跳过地址字段。
  2. 嵌入式(一对一)VS嵌入式(一对多):当我们讨论嵌入式文档对平面数据结构的好处时,如果我们的用户有多个地址,那么我们需要使用一个到很多关系。 用于定义一对一和一对多关系的模式如下:

一对一关系架构:

{
_id: String,
name: {
    first: String,
    last: String,
    }
email: String,
address: {
    street: String,
    city String,
    zip: Number,
    }
}

一对多关系模式:

  {
    _id: String,
    name: {
        first: String,
        last: String,
        }
    email: String,
    address: [{           // Embedded address doc with one to many relationship
        street: String,
        city String,
        zip: Number,
      }]
  }

在一对一关系的情况下,它不会对您的查询部分产生太大影响,但如果您将使用一对多关系,则查询中会有许多概念上的更改。

例如:主要是我们在更新两种数据结构时面临不同的情况,因此我将分享更新查询之间的差异。

要更新嵌入一对一关系的数据,您只需使用点表示法。

db.collection.update(
   { _id: 'anyId' },
   { $set: { "address.street": "abc" } }
)   

要更新嵌入了一对多关系的数据,您需要使用$运算符。在这一个中有两种不同的情况。首先,如果要更新子文档的特定元素,则第二个如果要更新所有子文档:

案例1查询将(使用$ operator):

  db.collection.update(
       { 'address.streent': 'abc' },
       { $set: { "address.$.street": "xyz" } }
  )   

案例2查询将(使用$[]):

  db.collection.update(
       { 'address.streent': 'abc' },
       { $set: { "address.$[]": "xyz" } }
  )  
© www.soinside.com 2019 - 2024. All rights reserved.