【问题标题】:Relationship of a model with an array of Ids of other model in Lucid Mongo模型与 Lucid Mongo 中其他模型的 ID 数组的关系
【发布时间】:2020-06-13 15:37:17
【问题描述】:

现在,我有一个教室的 mongoldb 数据库,并使用 AdonisJS 和 Lucid Mongo 制作了一个 API。在教室里有一个名为students 的集合和另一个名为classes 的集合。两个集合的结构如下。

students = {
   _id: ObjectID
   name: string
   age: number
}

classes = {
   _id: ObjectID
   name: string
   professorId: ObjectID
   students: ObjectID[]
}

如您所见,在classes 集合中,我有一个包含学生的数组。如何使用 Lucid Mongo 或简单的 mongodb

调用这种关系

【问题讨论】:

    标签: mongodb adonis.js


    【解决方案1】:

    如果您处于架构设计的早期阶段,您应该将相关表设计扁平化为单个集合,其中 class 是学生集合中的文档:

     students = {
       _id: ObjectID
       name: string
       age: number
       class = {
       _id: ObjectID
       name: string
       professorId: ObjectID
    }}

    在您现在拥有的相关架构中;必须在类集合上使用聚合管道,并将 Class - Student 数组按学生 $unwind 到单个学生文档中,然后 $lookup Student 集合。

    【讨论】:

    • 当然,如果学生只上一门课,这可能会奏效,但事实并非如此。一个学生可以选择他想要的任意多的课程。用这种方法我能做什么?
    【解决方案2】:

    如果最初的问题是如何“调用关系”并且您拥有这两个集合 - 方法是在相关字段(名称)上使用 $lookup。

    您从那里去哪里取决于您希望在最终查询结果中显示哪些数据/字段的具体情况。

    一个学生在多个班级并不会改变 $lookup 的需求。它将影响您最终查询的设计方式,这取决于您寻求的具体结果,即单个学生、所有学生、班级人数、班级名称等...

    如果您处于架构设计的早期并且可以从相关更改为平面 - 根据我的第一篇文章 - 这在 NoSQL 方法中更有效。例如,一个学生的简单 $match 将使他们的课程的显示非常简单。它也可以在您现在拥有的相关集合中完成,但涉及更多。

    【讨论】:

      【解决方案3】:

      不幸的是,Lucid Mongo 不支持你的聚合管道,但我使用 referMany 模型中的 referMany 方法解决了这个问题,如下所示:

       students() {
           return this.referMany('App/Models/Student','_id','studentsId)
       }
      

      【讨论】:

        猜你喜欢
        • 2021-02-27
        • 2018-06-24
        • 1970-01-01
        • 2012-05-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多