【问题标题】:Grouping in MongoDb using aggregate使用聚合在 MongoDb 中进行分组
【发布时间】:2018-11-25 21:45:48
【问题描述】:

我是 MongoDB 的初学者,我发现 Aggregate 函数很难理解。

我阅读了很多主题并尝试了很多东西,但是我无法获得我想要的结果。

实际上,我有两个架构:

1) Faculty.js

const FacultySchema = new Schema({

    name: {
        type: String,
        required: true
    }

});

2) Semester.js

const SemesterSchema = new Schema({

    name: {
        type: String,
        required: true
    },

    faculty: {
        type: Schema.Types.ObjectId,
        ref: 'faculties'
    }   

});

学期合集

[
  {
    "_id": ObjectId("5bf82da745209d0d48a91b62"),
    "name": "1st Semester",
    "faculty": ObjectId("5bf7f39a1972dd0b6c74de7d"),
    "__v": 0
  },
  {
    "_id": ObjectId("5bf8c3f945209d0d48a91b63"),
    "name": "2nd Semester",
    "faculty": ObjectId("5bf7f39a1972dd0b6c74de7d"),
    "__v": 0
  },
  {
    "_id": ObjectId("5bf8c3fe45209d0d48a91b64"),
    "name": "3rd Semester",
    "faculty": ObjectId("5bf7f39a1972dd0b6c74de7d"),
    "__v": 0
  },
  {
    "_id": ObjectId("5bf8c40345209d0d48a91b65"),
    "name": "4th Semester",
    "faculty": ObjectId("5bf7f39a1972dd0b6c74de7d"),
    "__v": 0
  }
]

我想将所有这些学期分组为一个在一个地方具有相同教员 ID 的数组。 比如:

[
{faculty: "BBA", semesters: ['first', 'second', 'third']},
{faculty: "BCA", semesters: ['first', 'second', 'third']}
];

我怎样才能做到这一点??

【问题讨论】:

  • 您能否发布来自FacultySemesters 集合的示例文档
  • 部分院系样本:{ "_id" : ObjectId("5bf82da745209d0d48a91b62"), "name" : "1st Semester", "faculty" : ObjectId("5bf7f39a1972dd0b6c74de7d"), "__v" : 0 } {“_id”:ObjectId(“5bf8c3f945209d0d48a91b63”),“名称”:“第二学期”,“教师”:ObjectId(“5bf7f39a1972dd0b6c74de7d”),“__v”:0 } {“_id”:ObjectId(“5bf8c3fe454”488b16d ),“名称”:“第三学期”,“教师”:ObjectId(“5bf7f39a1972dd0b6c74de7d”),“__v”:0 } {“_id”:ObjectId(“5bf8c40345209d0d48a91b65”),“名称”:“第四学期”,“教师”:ObjectId(“5bf7f39a1972dd0b6c74de7d”),“__v”:0}
  • 在这里我可以填充“学院”以访问学院集合中的所有字段。我想要的是对于所有不同的学院,我必须找到具有相同学院 ID 的学期数组。

标签: mongodb mongoose mongodb-query aggregation-framework


【解决方案1】:

您可以使用 $group 聚合首先找到不同的 faculties,然后使用 $lookup 从 Faculties 集合中获取 facultiesnames

Semester.aggregate([
  { "$group": {
    "_id": "$faculty",
    "semesters": { "$push": "$name" }
  }},
  { "$lookup": {
    "from": "faculties",
    "let": { "facultyId": "$_id" },
    "pipeline": [
      { "$match": { "$expr": { "$eq": ["$_id", "$$facultyId"] }}}
    ],
    "as": "faculty"
  }},
  { "$project": {
    "semesters": 1, "faculty": { "$arrayElemAt": ["$faculty.name", 0] }
  }}
])

或者您可以先使用$lookup,然后再使用$grouping 不同的names

Semester.aggregate([
  { "$lookup": {
    "from": "Faculty",
    "let": { "facultyId": "$_id" },
    "pipeline": [
      { "$match": { "$expr": { "$eq": ["$_id", "$$facultyId"] }}}
    ],
    "as": "faculty"
  }},
  { "$unwind": "$faculty" },
  { "$group": {
    "_id": "$faculty.name",
    "semesters": { "$push": "$name" }
  }},
  { "$project": {
    "semesters": 1, "faculty": "$_id", "_id": 0 }
  }}
])

【讨论】:

  • 这按预期工作。谢谢@Anthony Winzlet。我在哪里可以得到完整的描述来清楚地理解这个查询。
  • @John 您可以从我在答案中发布的链接中阅读文档。对于$group$lookup 聚合
猜你喜欢
  • 2019-05-19
  • 2019-01-31
  • 2020-11-16
  • 2019-06-29
  • 2020-09-15
  • 2021-07-27
  • 1970-01-01
  • 2018-06-26
  • 1970-01-01
相关资源
最近更新 更多