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而不是字符串吗?否则,必须先对其进行变换。