更新Mongodb中的嵌入文档:性能问题?
我是Mongodb的新手,听说Mongodb适合大量的读写操作。 嵌入式文档是实现这一点的功能之一。但我不确定这是否也是性能问题的原因。 书籍文档示例:更新Mongodb中的嵌入文档:性能问题?,mongodb,mongodb-query,Mongodb,Mongodb Query,我是Mongodb的新手,听说Mongodb适合大量的读写操作。 嵌入式文档是实现这一点的功能之一。但我不确定这是否也是性能问题的原因。 书籍文档示例: { "_id": 1, "Authors": [ { "Email": "email", "Name": "name" } ], "Title": "title", ... } 如果一个作者有数千本书,并且他的电子邮件需要更
{
"_id": 1,
"Authors": [
{
"Email": "email",
"Name": "name"
}
],
"Title": "title",
...
}
如果一个作者有数千本书,并且他的电子邮件需要更新,我需要写一些查询,可以
这些行动似乎效率不高。但是这种类型的更新是无处不在的,我相信开发者已经考虑过了。那么,我哪里弄错了呢?您当前的嵌入式模式设计有其优点,其中之一就是数据局部性。由于MongoDB将数据连续存储在磁盘上,因此将您需要的所有数据放在一个文档中可以确保旋转的磁盘搜索到磁盘上特定位置所需的时间更少 如果您的应用程序经常访问
书籍
信息以及作者
数据,那么您几乎肯定会选择嵌入式路径。嵌入文档的另一个优点是编写数据时的原子性和隔离性
为了说明这一点,假设您希望更新一位作者的所有书籍的电子邮件字段,这可以通过一个单一(原子)操作完成,这不是MongoDB的性能问题:
db.books.updateMany(
{ "Authors.name": "foo" },
{
"$set": { "Authors.$.email": "new@email.com" }
}
);
或使用早期MongoDB版本:
db.books.update(
{ "Authors.name": "foo" },
{
"$set": { "Authors.$.email": "new@email.com" }
},
{ "multi": true }
)
在上面的中,您使用了,它通过标识要更新的数组中的元素而无需显式指定元素在数组中的位置,从而有助于更新包含嵌入式文档的数组。将其与$
运算符上的一起使用
有关MongoDB中数据建模的更多详细信息,请特别阅读文档
另一个设计选项,您可以考虑引用规范化模式的文档。例如:
// db.books schema
{
"_id": 3
"authors": [1, 2, 3] // <-- array of references to the author collection
"title": "foo"
}
// db.authors schema
/*
1
*/
{
"_id": 1,
"name": "foo",
"surname": "bar",
"address": "xxx",
"email": "foo@mail.com"
}
/*
2
*/
{
"_id": 2,
"name": "abc",
"surname": "def",
"address": "xyz",
"email": "abc@mail.com"
}
/*
3
*/
{
"_id": 3,
"name": "alice",
"surname": "bob",
"address": "xyz",
"email": "alice@mail.com"
}
//db.books架构
{
“_id”:3
“作者”:[1,2,3]//我认为您的模式设计基本上是错误的。MongoDB允许您以体系结构的方式构建数据,但这并不是构建数据效率低下的借口。如果您可能需要定期更新整个集合中的数千个文档,那么您是否有正确的模式设计值得一问
关于模式设计以及与关系数据库结构的比较,有很多文章。例如: