Javascript 使用聚合进行合并

Javascript 使用聚合进行合并,javascript,node.js,mongodb,mongoose,aggregation-framework,Javascript,Node.js,Mongodb,Mongoose,Aggregation Framework,我正在创建小型学习考勤系统 我有两个收藏: 员工: { "id": "5f474ebb12a55e2a1c4fb39f" "emp_status": true, "logAttendance": true, "createdAt": "2020-08-27T06:09:31.533Z", "empId": "

我正在创建小型学习考勤系统

我有两个收藏:

员工:

{
    "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
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": "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
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",
                },
               ....
},
......

] 
我希望它按“employee”对它们进行分组,这是employee集合中的ObjectId,并且用firstName lastName填充员工

我的尝试:

{
    "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
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": "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
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”,<---我希望统计数据中的此id填充员工数据 它不起作用了
我尝试使用查找,但没有工作。

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

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

正在工作

但我正在获取employeeData:[]空阵列正在处理您提供的数据。请检查变量名。这是我检查的第一件事,它应该给出结果。有两种可能性1。没有连接2。变量名不正确。您可以在演示中看到,tht工作正常,不是吗?但是员工的ObjectId与考勤中的完全相同。员工我进行了交叉验证,我尝试了另一个字段“empId”,但结果相同。您确定您的Ateendand.Employee字段是ObjectId而不是字符串吗?否则,必须先对其进行变换。