【问题标题】:Mongoose: How to extract arrays in subdocuments to a single array in the parent documentMongoose:如何将子文档中的数组提取到父文档中的单个数组中
【发布时间】:2021-09-02 18:43:22
【问题描述】:

使用 Mongoose 的 Express 服务器在其路由之一中从数据库返回以下 JSON:

{
  "gradeLevel": 12,
  "classes": [
    {
      "className": "A",
      "students": [
        "student1", "student2","student3"
      ]
    },
    {
      "className": "B",
      "students": [
        "student4", "student5","student6"
      ]
    },
    {
      "className": "C",
      "students": [
        "student7", "student8","student9"
      ]
    }
  ]
}

在客户端中,例如,我希望能够有效地检查学生是否在父文档中的任何类子文档中。以下是我构想的解决方案,但不确定哪个是最佳实践:

  1. 当学生被推送到班级子文档时,也将学生推送到家长的students 字段。
  2. 在模型的 toJSON 转换中添加一个新字段以编译所有学生。
  3. 在客户端使用 vanilla Javascript 提取所有学生

【问题讨论】:

    标签: javascript json mongodb mongoose mern


    【解决方案1】:

    我也遇到过这个问题。但是要解决这个问题,您需要一个名为 allStudents 的单独集合,例如它的架构如下 { nameOfStudent: 'String' className: 'String' }

    然后将其与子文档相应地聚合。因此,无论您将新学生推入 allStudents 并提及 className,它将被推入相应班级名称的学生子文档。

    【讨论】:

    • 谢谢您,这在性能方面是否理想,因为添加和删除学生需要更多时间?
    • 不,它不会对性能产生太大影响,因为它只是过滤并添加一次,并且在需要时从子文档中获取
    • 如果您的问题得到解决,请批准此答案:)
    • 谢谢,这绝对有帮助。我会批准这个并添加另一个使用 Javascript 的 some() 方法的解决方案。
    【解决方案2】:

    用点符号查询,比如

    .find({"classes.students":"student8"})
    

    将检查classes数组中每个对象的students字段,返回包含任何班级特定学生的文档。

    【讨论】:

    • 谢谢@Joe,我应该在哪里使用这个查询?我不确定我是否可以/应该在 React 客户端中使用 Mongoose 代码。
    【解决方案3】:

    感谢您提供的答案。只是分享另一个使用 vanilla Javascript 的解决方案,可能对类似情况的人有用:

      checkStudent = (batch, student) => {
        let result = null
        const inClass = (cls) => {
          if (cls.students.includes(student)) {
            result = cls
            return true
          }
          return false
        }
        batch.classes.some(inClass)
        return result
      }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-09-17
      • 2018-01-26
      • 2015-02-18
      • 2014-08-27
      • 2015-06-23
      • 2015-12-22
      相关资源
      最近更新 更多