Java MongoDb聚合,用于根据同一集合中所有文档的数组对象中存在的ID筛选列表

Java MongoDb聚合,用于根据同一集合中所有文档的数组对象中存在的ID筛选列表,java,mongodb,mongodb-query,aggregation-framework,aggregation,Java,Mongodb,Mongodb Query,Aggregation Framework,Aggregation,在我的mongodb中,我有如下数据: { "studentId": "a1", "name":"John Doe" "studentsReffered": [ { "course": "BTECH", "students": [ { "st

在我的mongodb中,我有如下数据:

{
  "studentId": "a1",
  "name":"John Doe"
  "studentsReffered": [    
    {
      "course": "BTECH",
      "students": [
        {
          "studentId": "a2"
        },
        {
          "studentId": "a3"
        }
      ]
    },
    {
      "course": "MTECH",
      "students": [        
        {
          "studentId": "a4"
        },
        {
          "studentId": "a5"
        }
      ]
    }
  ]
},
{
  "studentId": "a2",
  "name":"Joseph"
  "studentsReffered": [    
    {
      "course": "BTECH",
      "students": [
        {
          "studentId": "a6"
        }
      ]
    }
  ]
}
上面的JSON包含MongoDB集合中的文档。每个文档包含学生的所有详细信息以及推荐详细信息摘要。i、 e.对于每个学生,都需要一个现场学生,其中包含该学生推荐的所有学生的ID

我想单独显示学生的所有详细信息以及检索单个学生时引用的学生姓名。如下

{
  "studentId": "a1",
  "name":"John Doe"
  "studentsReffered": [    
    {
      "course": "BTECH",
      "students": [
        {
          "studentId": "a2",
          "name":"Joseph"
        },
        {
          "studentId": "a3",
          "name":"Lorem Ipsum"
        }
      ]
    },
    {
      "course": "MTECH",
      "students": [        
        {
          "studentId": "a4",
          "name":"Lorem Ipsum"
        },
        {
          "studentId": "a5",
          "name":"Lorem Ipsum"
        }
      ]
    }
  ]
}
我已尝试使用mongodb聚合解决此问题。但不幸的是,我无法为此编写查询。因此,我们可以使用聚合实现上述场景。

您可以尝试

  • $facet
    要创建2个数组,
    用户
    用户详细信息姓名和学生ID,请在
    allUsers
  • $project
    迭代循环
    • $map
      作为allUsers数组输入
    • $map
      输入为studentsReffered数组
    • $map
      作为学生数组输入
    • $reduce
      在条件匹配时从
      用户
      数组中获取学生的数据
  • $unwind
    解构allUsers阵列
  • $replaceWith
    在根目录中替换allUsers对象

一个问题@turivishal,我有一个问题->如果我想添加更多学生的详细信息,那么我是否需要为每个字段使用$reduce。i、 e.如果我想添加姓名、姓氏、年龄、阶级等。好的,这已经从$reduce中减少了一些分数,您必须在项目中定义
用户
,否则所有都将在$reduce中管理,检查并更正我的答案。如何计算执行mongo db query@turivishal所需的时间。我使用的是以秒为单位显示时间的robo3t。但对于相同的数据,每次在本地主机mongodb上执行时间都会有所不同。
db.collection.aggregate([
  {
    $facet: {
      users: [
        {
          $project: {
            studentId: 1,
            name: 1
            // add fields as you want it will automatically reflect in join
          }
        }
      ],
      allUsers: []
    }
  },
  {
    $project: {
      allUsers: {
        $map: {
          input: "$allUsers",
          in: {
            $mergeObjects: [
              "$$this",
              {
                studentsReffered: {
                  $map: {
                    input: "$$this.studentsReffered",
                    in: {
                      $mergeObjects: [
                        "$$this",
                        {
                          students: {
                            $map: {
                              input: "$$this.students",
                              as: "s",
                              in: {
                                $reduce: {
                                  input: "$users",
                                  initialValue: { studentId: "$$s.studentId" },
                                  in: {
                                    $cond: [
                                      { $eq: ["$$this.studentId", "$$s.studentId"] },
                                      "$$this",
                                      "$$value"
                                    ]
                                  }
                                }
                              }
                            }
                          }
                        }
                      ]
                    }
                  }
                }
              }
            ]
          }
        }
      }
    }
  },
  { $unwind: "$allUsers" },
  { $replaceWith: "$allUsers" }
])