Mongoose - 对象之间的多重关系

Posted

技术标签:

【中文标题】Mongoose - 对象之间的多重关系【英文标题】:Mongoose - multiple relations between objects 【发布时间】:2013-07-11 21:24:27 【问题描述】:

假设我正在构建一个社区博客引擎:

我们有几个类别Category 我们有很多博客Blog 我们有很多帖子Post 我们有可能作者Account 每个Category 可能包含多个Blog 每个Blog 可能包含在多个Category 中 每个Blog 可能包含多个Post 每个Post 可能包含在多个Blog 中 每个Account 可能同时是几个Blog 中的ownereditor。这就是为什么它可能在 ownereditor 字段中包含多个 Blog 的 ObjectID 数组。 每个Blog 都可以由多个Account 拥有和编辑。这就是为什么它可能在 ownereditor 字段中包含多个 Account 的 ObjectID 数组。

这是一个架构:

categorySchema = mongoose.Schema(
  title: String
  blogs: [
    type: ObjectId
    ref: "Blog"
  ]
)

blogSchema = mongoose.Schema(
  title: String
  description: String
  owner:
    type: ObjectId
    ref: "Account"

  editor: [
    type: ObjectId
    ref: "Account"
  ]
  category: [
    type: ObjectId
    ref: "Category"
  ]
  posts: [
    type: ObjectId
    ref: "Post"
  ]
)
postSchema = mongoose.Schema(
  blogs: [
    type: ObjectId
    ref: "Blog"
  ]
  author:
    type: ObjectId
    ref: "Account"
)

accountSchema = mongoose.Schema(
  name: String
  owner: [
    type: ObjectId
    ref: "Blog"
  ]
  editor: [
    type: ObjectId
    ref: "Blog"
  ]
)

每个帖子还可能包含点赞、cmets 和其他可能仅与此对象相关的对象。

问题是当我尝试添加新的Blog 时,我将不得不管理许多集合中的许多字段。同样的事情是当我编辑Blog 或删除时——我必须在大量对象的各种数组字段中查找、检查、修改/删除大量记录。

我是suggested,我不应该存储直接关系(类别 --> 博客、博客 --> 帖子),只存储反向关系(博客 --> 类别、帖子 --> 博客),当我需要时要获取某个类别中的所有博客,请执行一个简单的Blogs.find(category: cat_id),但想想如果我需要一些 deep 请求,例如Get all Blogs where account_ID both owner and editor,会发生什么。假设可以有很多博客,并且每个博客都可能包含很多作者和编辑,直接Blog.find owner:acc_id, editor:acc_id 会更快。这就是为什么我认为我需要双向链接。

所以,我的问题是:

我真的需要对象之间的双向链接吗? 如果是,是否有任何工具可以优化使用它?

也许我应该在 Mongoose 中使用某种多对多关系?

谢谢!

【问题讨论】:

在我看来,您想在对象之间建立关系。请问你为什么选择mongoDB。它的全部意义在于它是一个 noSQL 数据库。这意味着当你开始开发一个 mongoDB 应用程序时,你应该改变你的思维方式。你需要考虑的不是关系,而是文章。每篇文章都应该是完整的。一旦开始设计关系,就会破坏 NoSQL 模型,并且会讨厌 mongoDB。你会认为这是最糟糕的,但事实并非如此。所以我想说弄清楚你的设计,然后决定一个数据库。 【参考方案1】:

不,您不需要双向链接。

你只需要

Blog->Category
Blog->Editors
Blog->Owners
Post->Blog

因为您的类别和用户从不更改对象 ID,所以您不必担心更新博客内的引用。此外,当您要删除博客时,请不要删除记录。相反,添加一个将博客标记为已删除的标志。当您显示内容时,只需检查相应博客的删除标志,甚至在您的查询中添加一个条件来完全避免这些结果。 (这也有保存历史的好处)

总而言之,您可以从更具体和可变的内容链接到更静态的内容,而不是创建双向链接。要删除记录,可以添加删除标志,不用担心追记录,也可以选择所有有问题的 blog_id 的帖子先删除。

【讨论】:

以上是关于Mongoose - 对象之间的多重关系的主要内容,如果未能解决你的问题,请参考以下文章

使用 mongoose 将 mongo 对象的字段设置为空

通过Mongoose(Node JS)在Mongo DB中插入没有JSON模式的JSON对象

mongoose - 数据关系模型

如何从 mongoose 的 mongo 文档中返回一个数组?

将 mongoose 与预先存在的 mongo 集合连接

将 mongoose 与预先存在的 mongo 集合连接