Mongoose:如何将子文档中的数组提取到父文档中的单个数组中

Posted

技术标签:

【中文标题】Mongoose:如何将子文档中的数组提取到父文档中的单个数组中【英文标题】:Mongoose: How to extract arrays in subdocuments to a single array in the parent document 【发布时间】: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"
      ]
    
  ]

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

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

【问题讨论】:

【参考方案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
  

【讨论】:

以上是关于Mongoose:如何将子文档中的数组提取到父文档中的单个数组中的主要内容,如果未能解决你的问题,请参考以下文章

将子组件添加到父组件并将父组件添加到文档

Mongoose TypeError:用户不是构造函数

Mongoose Object-literal Subdoc 不可访问

如何将子文档插入 mongo 集合?

如何将子文档插入 mongo 集合?

如何使用Mongoose和MongoDB 2.6插入子文档中数组中的特定位置