我正在开发一个使用mongoDB数据库和express / nodeJS的Web应用程序。我想创建一个我有用户的项目,并且用户可以有帖子,帖子可以具有很多属性,例如标题,创建者和日期。我对如何执行此操作感到困惑,以免避免在数据库中进行复制。我通过在所有用户帖子列表中使用ID来尝试引用,例如:[postID1,postID2,postID3等...]。问题是我希望能够对所有用户帖子使用查询并将其显示在ejs模板中,但是我不知道该怎么做。我将如何使用参考?我应该怎么做才能使这个建模系统最适合关系?
任何帮助将不胜感激!
谢谢!
答案 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文档(我根据您的情况编辑了以下段落)
使用引用时,关系的增长决定了 存储参考。如果每个用户的帖子数很少 增长有限,将帖子参考存储在用户内部 文档有时可能有用。否则,如果发帖数 每个用户不受限制,此数据模型将导致可变, 不断增长的阵列。
现在,您必须决定什么对您的项目最好,同时要记住您的模型应该满足所有测试用例
和平