首页 > 解决方案 > 在栅栏上:MongoDB 的 $graphLookup 与非图聚合以及如何最好地设置 Mongoose 模式?

问题描述

背景

我正在构建一个 Nodejs/Mongoose 后端。它连接到 MongoDB 数据库。我的数据包括院系、课程和课程。每个学院都由几个课程组成。每门课程都是一个但可能是多个项目的一部分。将来我可能会添加更多:例如学生、教师、课程。搜索空间可能会显着嵌套。

数据结构图解

例如,我的后端应用程序旨在获取特定程序的课程。或获取教师的课程。而且还可以将新课程或计划落实到位或更新现有课程或计划。

我绑定到 MongoDB。

问题

如何最好地使用 Mongoose 设置我的模式?我有两个选择。(1) 使用引用设置模式来表达院系、项目和课程之间的联系——并使用 MongoDB 的 $filter/find 或任何其他非图形方法来查找感兴趣的课程或项目。或者 (2) 以一种为使用 MongoDB 的 $graphLookup 查找感兴趣的课程或程序而优化的方式设置模式。

注意我可以想象,与遍历所有案例以检查特定条件的方法相比,在我的案例中使用 $graphLookup 在计算上的要求较低。

我刚开始这个项目,想避免以后后悔。

问题

最好的前进方式是什么?优缺点都有什么?一个人的优缺点是否明显胜过另一个人?

所有这一切都假设这些确实是要考虑和比较的两个选项。

设置 Mongoose 模式时需要考虑什么?

现状

课程和项目文件分别包含有关它们所属的项目或教师的信息。我想到了 $filter 。

// Faculty schema
const facultySchema = new mongoose.Schema({
  name: {
    full: String,
    short: String
  }
})

// Program schema
const programSchema = new mongoose.Schema({
  name: {
    full: String,
    short: String
  },
  type: String,
  // Part of what faculty (ObjectId)?
  partOf: [{id: String}]
})

// Course schema
const courseSchema = new mongoose.Schema({
  _id: String,
  name: {full: String},
  courseCoordinator: String,
  // Part of what program (ObjectId)?
  partOf: [
    {
      id: String,
      startPeriod: Number,
      endPeriod: Number,
      year: Number
    }
  ]
})

但是如果我把它转过来(例如,包含有关它们包含哪些课程的信息的程序文档),我可以 $graphLookup 使用最大深度为 1 或 2 来查找感兴趣的程序或课程(见下图)。

从 F 到所有连接的 C 搜索图

谢谢你。

标签: mongodbaggregation-frameworkgraph-theorymongoose-schemagraphlookup

解决方案


推荐阅读