【问题标题】:Merging Using Aggregate使用聚合进行合并
【发布时间】:2020-12-25 00:53:51
【问题描述】:

我正在创建用于学习的小型考勤系统,

我有两个收藏:

员工:

{
    "id": "5f474ebb12a55e2a1c4fb39f"
    "emp_status": true,
    "logAttendance": true,
    "createdAt": "2020-08-27T06:09:31.533Z",
    "empId": "10000",
    "firstName": "firstName",
    "lastName": "lastName",
    "gender": "male",
    "dob": "2020-07-11T08:53:20.691Z",
    "email": "abcd@abcd.com",
    "department": {
            "_id": "5f2f8599e5f4c015e4827c3f",
            "departmentName": "department",
            "organizationName": "department ",
        },
    "designation": {
            "_id": "5f2f85b2e5f4c015e4827c42",
            "designationName": "designation "
        },
     .
     .
     .
}

出席:

{
            "_id": "5f4a05bb09f14077c82157bb",
            "empId": "10000",
            "employee": "5f474ebb12a55e2a1c4fb39f"  
            "weekOff": false,
            "dated": "2020-08-29T07:37:31.525Z",
            "inTime": "2020-08-29T04:30:08.000Z",
            "outTime": "2020-08-30T15:30:25.000Z"
} .... x 30 days x 100 employees

我希望它按“员工”(即员工集合中的 ObjectId)对它们进行分组,并使用 firstName lastName 填充员工。

我尝试了什么:

const stats = await Attendance.aggregate([
    {
      $group: {
        _id: "$employee",

        attendance: {
          $push: {
            dated: "$dated",
            weekOff: "$weekOff",
            present: "$present,
            inTime: "$inTime",
            outTime: "$outTime",
          },
        },
      },
    },
    {
      $lookup: {
        from: "Employee",           // " module.exports = Employee " from employee Schema;
        localField: "employee",
        foreignField: "_id",
        as: "employeeData",
      },
    },
  ]);

结果:

[{
        "_id": "5f474ebb12a55e2a1c4fb39f",  // this Id suppose to be populated with employee data 
                                            //    which is not Working.
        "attendance": [
                {
                    "dated": "2020-08-01T07:37:31.546Z",   // 01-08-2020
                    "weekOff": false,
                    "inTime": "2020-08-01T08:00:08.131Z",
                    "outTime": "2020-08-01T13:39:31.543Z",
                },
                {
                    "dated": "2020-08-02T20:44:04.245Z",   // 02-08-2020
                    "weekOff": false,
                    "inTime": "2020-08-02T04:16:16.670Z",
                    "outTime": "2020-08-02T14:27:04.529Z",
                },
               ....
},
{
        "_id": "5f474efe12a5256g1c4fb3ee",
        "attendance": [
                {
                    "dated": "2020-08-01T07:37:31.546Z",   // 01-08-2020 
                    "weekOff": false,
                    "inTime": "2020-08-01T08:00:08.131Z",
                    "outTime": "2020-08-01T13:39:31.543Z",
                },
                {
                    "dated": "2020-08-02T20:44:04.245Z" ,// 02-08-2020
                    "weekOff": false,
                    "inTime": "2020-08-02T04:16:16.670Z",
                    "outTime": "2020-08-02T14:27:04.529Z",
                },
               ....
},
......

] 

"_id": "5f474efe12a5256g1c4fb3ee",

【问题讨论】:

  • 您确定您的 Ateendand.employee 字段是 ObjectId 而不是字符串?否则你必须先改造它。

标签: javascript node.js mongodb mongoose aggregation-framework


【解决方案1】:

当您使用常规查找时,$group 阶段会生成数组。因此,您需要展开它以展平数组,然后使用查找。我使用$$ROOT 获取所有字段,但如果您需要自定义字段,您的方式也是正确的。如果您需要重新构造字段,那么您可以轻松使用$group

db.Attendance.aggregate([
  {
    $group: {
      _id: "$employee",
      attendance: {
        $push: "$$ROOT"
      }          
    }        
  },
  {
    $unwind: "$attendance"
  },
  {
    $lookup: {
      from: "Employee",
      localField: "attendance.employee",
      foreignField: "id",
      as: "employeeData",
      
    },
    
  }
])

工作Mongo playground

【讨论】:

  • 但是我得到了employeeData : [ ] empty array
  • 正在处理您提供的数据。请检查变量名。
  • 这是我检查的第一件事,并且全部正确
  • 它应该给出结果。可能有两种可能 1. 没有连接 2. 变量名不正确。您可以在演示中看到运行良好,不是吗?
  • 但是 Employee 的 ObjectId 与出勤中的完全一样。employee 我确实交叉验证过,我尝试使用另一个字段“empId”但结果相同
猜你喜欢
  • 1970-01-01
  • 2013-11-19
  • 1970-01-01
  • 2020-05-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-28
  • 1970-01-01
相关资源
最近更新 更多