如何使用MongoDB创建关系?

时间:2018-11-21 17:51:29

标签: node.js database mongodb express

我正在开发一个使用mongoDB数据库和express / nodeJS的Web应用程序。我想创建一个我有用户的项目,并且用户可以有帖子,帖子可以具有很多属性,例如标题,创建者和日期。我对如何执行此操作感到困惑,以免避免在数据库中进行复制。我通过在所有用户帖子列表中使用ID来尝试引用,例如:[postID1,postID2,postID3等...]。问题是我希望能够对所有用户帖子使用查询并将其显示在ejs模板中,但是我不知道该怎么做。我将如何使用参考?我应该怎么做才能使这个建模系统最适合关系?

任何帮助将不胜感激!

谢谢!

2 个答案:

答案 0 :(得分:1)

这是经典的父子关系,您的问题是您将关系存储在错误的记录中:-)。父母绝对不应包含对子女的提及。相反,每个孩子都应该引用父对象。为什么不反过来呢?这是一个历史古怪:这样做是因为经典关系表不能在单个字段中具有多个值,这意味着您不能在关系表中轻松存储多个子ID,而由于每个子ID如果有一位家长,则在孩子中设置一个字段很容易。通过使用数组,Mongo文档 可以在单个字段中具有多个值,但是除非您确实有这样做的理由,否则最好遵循历史范例。

这如何适用于您的情况?您想要做的是将对所有子项(即帖子ID)的引用存储为父项中的列表(即用户文档中的数组)。这不是通常的方法。而是在每个孩子(即每个帖子)中都有一个名为user_id的字段,并在其中存储userID。

下一步,确保在user_id字段上创建索引。

使用该设置,可以轻松地发布帖子并弄清楚用户是谁(只需查看user_id字段)。而且,如果您想查找用户的所有帖子,只需执行posts.find({user_id:'XXXX'})。如果您在该字段上有索引,则查找将快速执行。

在子级中存储父级引用几乎总是比在父级中存储子级引用更好。尽管Mongo足够灵活,可以让您以任何一种方式进行结构化,但除非您有真正的理由,否则它不是首选。

编辑 如果您有正确的理由将子引用存储在父级中,则采用如下结构: 用户= {帖子:[postID1,postID2,postID3,...]} 您可以通过user.find({posts:“ XXXX”})查找特定帖子的用户。 MongoDB足够聪明,可以知道您正在搜索帖子数组包含元素“ XXX”的用户。而且,如果您在posts字段上创建索引,那么查询应该很快。

答案 1 :(得分:0)

我想提到,至少在NoSQL数据库中包含 Child 引用的 Parent 中没有任何问题。这完全取决于您的需求。 您与用户和帖子之间具有一对多关系,并且可以通过以下三种方式对数据进行建模

嵌入式数据模型

str

包含子参考的父母

{
   user: "username",
   post: [
            {
              title: "Title-1",
              creator: "creator",
              published_date: ISODate("2010-09-24")
            },
            {
              title: "Title-2",
              creator: "creator",
              published_date: ISODate("2010-09-24")
            }
   ]
}


包含父级引用的子级

{
   user: "username",
   posts: [123456789, 234567890, ...]
}

{
    _id: 123456789,
    title: "Title-1",
    creator: "creator",
    published_date: ISODate("2010-09-24")

}

{
    _id: 234567890,
    title: "Title-2",
    creator: "creator",
    published_date: ISODate("2010-09-24")

}

根据MongoDB文档(我根据您的情况编辑了以下段落)

使用引用时,关系的增长决定了 存储参考。如果每个用户的帖子数很少 增长有限,将帖子参考存储在用户内部 文档有时可能有用。否则,如果发帖数 每个用户不受限制,此数据模型将导致可变, 不断增长的阵列。

参考:https://docs.mongodb.com/manual/tutorial/model-referenced-one-to-many-relationships-between-documents/

现在,您必须决定什么对您的项目最好,同时要记住您的模型应该满足所有测试用例

和平