MongoDB - 处理嵌入式文档和关系

rag*_*lka 6 embedded mongodb

我正在为我正在构建的 Web 应用程序研究 MongoDB。来自 MySQL 背景,嵌入式文档的概念并不是那么容易完全理解。

假设我有一个名为的文档blogpost,它看起来像这样:

db.posts.save({
    _id: 1
    title: "first post!",
    body: "post content",
    author: {
        _id: 1,
        name: 'John'
        email: 'jonh@doe.com'
    },
    comments: [
        {
            _id: 20,
            author: 'mary',
            content: 'This blog post is cool!'
        }
    ]
});
Run Code Online (Sandbox Code Playgroud)

每个作家实际上将被存储在在authors收集,当我保存blogpost,我只会从复制数据author文件,并将其粘贴所以它嵌入在blogpost文件。这是一个好方法吗?

我担心的是,当约翰更新他的电子邮件地址时,它只会在authors集合中更新。他的一些较早的博文会显示一个过时的电子邮件地址。

MongoDB 是否有处理该问题的方法,还是我需要在我的应用程序代码中自己做?

如果我在我的应用程序代码中这样做,那么首先将作者嵌入到博客文章中有什么意义?我可以只存储引用 ,author _id并在单独的查询中查找作者。

另一方面,如果我需要存储历史数据,例如带有客户信息的发票,那么将客户文档嵌入到发票文档中是有意义的,因为发票需要显示创建发票时存在的客户数据.

对于评论部分,我已经阅读了多集合 vs 嵌入式文档,当谈到评论时,多集合似乎是要走的路。http://mongly.com/Multiple-Collections-Versus-Embedded-Documents/

那么,总的来说 - 我是否完全错过了嵌入式文档的重点?

Asy*_*sky 4

你没有错过重点:)

关键是当您存储/更新/获取集合中的各种实体时,必须执行多少次读取和多少次写入?

您可能会不断(每天?)创建新帖子并经常创建新评论,并且非常频繁地查询帖子。

与上述相比,更新作者电子邮件之类的操作非常罕见。您希望优化应用程序中每次发生数百或数千次的读取和写入的性能,而不必担心非常不频繁的操作的性能。

话虽如此,我会存储帖子中嵌入的基本作者信息,但我只会存储每篇帖子都必须显示的信息。如果我想将有关作者的其他详细信息保留在自己的集合中,我希望用户需要单击其他链接才能查看这些详细信息(留出时间进行另一次阅读)。