node.js - 如何使用 MongoDB 创建关系?

标签 node.js database mongodb express

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

如有任何帮助,我们将不胜感激!

谢谢!

最佳答案

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

这如何适用于您的情况?您要做的是将对所有子项(即帖子 ID)的引用存储为父项中的列表(即用户文档中的数组)。这不是执行此操作的常用方法。相反,在每个子项中(即在每个帖子中),都有一个名为 user_id 的字段,并将用户 ID 存储在那里。

接下来,确保在 user_id 字段上创建索引。

有了这个设置,就可以很容易地发帖并找出用户是谁(只需查看 user_id 字段)。如果你想找到一个用户的所有帖子,只需执行 posts.find({user_id: 'XXXX'})。如果您在该字段上有索引,查找将快速执行。

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

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

关于node.js - 如何使用 MongoDB 创建关系?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53417919/

相关文章:

html - 使用 node.js 在 http ://localhost instead of file://, 上查看站点

node.js - Node 安全服务关闭 : getaddrinfo ENOTFOUND api. nodesecurity.io

Mongodb Gridfs 减少图像大小

mongodb - 如何使用数组中的多键索引改进 mongo 查询

javascript - 正确初始化 IndexedDB 对象存储

arrays - Linux 控制台中的 MongoDB 命令带有 --eval (print

node.js - 是否可以仅在尚未安装 npm 包的情况下安装它?

node.js - 带有嵌套 promise 的循环

sql-server - 需要有关归档大型 SQL Server 表的建议

sql - Azure Data Studio 架构图?