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:如何将子文档中的数组提取到父文档中的单个数组中的主要内容,如果未能解决你的问题,请参考以下文章