mongodb +具有多个集合的分组依据

时间:2020-03-26 12:35:28

标签: mongodb mongoose aggregation-framework mongoose-schema

我有3到4个收藏

  1. 用户
  2. 付款
  3. 分支机构
  4. 成绩

在“用户”表中,我们有多种类型的用户,例如学生,父母。

在付款表中,用户付款明细包含部分或全部金额的付款明细。

在分支中,表具有分支详细信息。

我正在尝试根据分支机构和等级查找报告。

  1. 该分支机构的用户总数
  2. 该分支机构中基于paidStatus列的付费用户总数。
  3. 根据receivedAmount列(总和)在该分支中收到的总金额
  4. 按用户和branchId分组的总余额
  5. 分支名称。

示例用户表:

[
  {
    "_id": "5b372ea5b0103b4ab2409ea6",
    "name" : "User 1",
    "role" : "student",
    "enrollmentCode": "X1",
    "branchId": "5b36388c7e50f13e845346e2",
    "classId" : "5b36388c7e50f13e84534343"
  },
  {
    "_id": "5b372ea5b0103b4ab2409ea7",
    "name" : "User 2",
    "role" : "student",
    "enrollmentCode": "X2",
    "branchId": "5b36388c7e50f13e845346e2",
    "classId" : "5b36388c7e50f13e8453433d"
  }, 
  {
    "_id": "5b372ea5b0103b4ab2409ea9",
    "name" : "User 3",
    "role" : "student",
    "enrollmentCode": "X3",
    "branchId": "5b36388c7e50f13e845346e2",
    "classId" : "5b36388c7e50f13e8453433x"
  }
]

付款表:

[
  {
    "_id": "5b372ea5b0103b4ab2409e32",
    "userId": "5b372ea5b0103b4ab2409ea6",
    "enrollmentCode": "X1",
    "branchId": "5b36388c7e50f13e845346e2",
    "classId" : "5b36388c7e50f13e8453433d",
    "receivedAmount": 5000,
    "balanceAmount": 2000,
    "paidStatus": false
  },
  {
    "_id": "5b372ea5b0103b4ab2409e32",
    "userId": "5b372ea5b0103b4ab2409ea6",
    "enrollmentCode": "X1",
    "branchId": "5b36388c7e50f13e845346e2",
    "classId" : "5b36388c7e50f13e8453433d",
    "receivedAmount": 1000,
    "balanceAmount": 500,
    "paidStatus": false
  },
  {
    "_id": "5b372ea5b0103b4ab2409e32",
    "userId": "5b372ea5b0103b4ab2409ea7",
    "classId" : "5b36388c7e50f13e8453433d",
    "enrollmentCode": "X2",
    "branchId": "5b36388c7e50f13e845346e2",
    "receivedAmount": 1000,
    "balanceAmount": 500,
    "paidStatus": true
  }
]

分支表

[
  {
    "_id": "5b36388c7e50f13e845346e2",
    "name": "Test 1"
  },
  {
    "_id": "5b36388c7e50f13e845346e2",
    "name": "Test 2"
  },
  {
    "_id": "5b36388c7e50f13e845346e2",
    "name": "Test 3"
  }
]

类表与我们相同。

我的查询:

db.users.aggregate([ {  $match : { role : "student"}} , { $group : { _id : "$student.branchId", totalStudents : { $sum : 1 }}}, {$lookup: {from: "branches", localField: "_id", foreignField: "_id", as: "branches"}}, {$project : { _id : 1, totalStudents : 1, 'branches.branchCode' : 1, 'branches.name' :1}}] )

我可以获取学生人数,分支机构名称以及除以外的所有信息。我不知道要按付款方式分组并汇总金额。

我的查询输出:

[{ "_id" : ObjectId("5b89161d1326f1646fabb59e"), "totalStudents" : 295, "receivedAmount" : 1000, "branches" : [ { 
 "name" : "abcd" } ] }
    { "_id" : ObjectId("5b47343d55b8344687674b7b"), "totalStudents" : 104, "branches" : [ {  "name" : "xxxx" } ] }]

预期输出:

[
  {
    "_id": ObjectId("5b89161d1326f1646fabb59e"),
    "totalStudents": 295,
    "receivedAmount" : 12345,
    "paidStudents" : 1,
    "branches": [
      {
        "name": "abcd"
      }
    ]
  }
     {
    "_id": ObjectId("5b47343d55b8344687674b7b"),
    "totalStudents": 104,
    "receivedAmount" : 12345,
    "paidStudents" : 1,
    "branches": [
      {
        "name": "xxxx"
      }
    ]
  }
]

0 个答案:

没有答案