我试图了解如何最好地构建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中提供了各种数据建模模式和模式设计。我将分享我遇到的问题以及不同数据库模式的好处。我们将在下面逐一讨论:
一对一关系架构:
{
_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" } }
)