用于计算出勤率的mongodb聚合
我有一个集合,其中包含具有以下值的文档用于计算出勤率的mongodb聚合,mongodb,mongoose,Mongodb,Mongoose,我有一个集合,其中包含具有以下值的文档 { "_id": ObjectID("XXXXXX"), "more details" :more details "attendance": [ { "date": ISODate("2015-08-11T18:30:00.000Z"), "students": [ { "studentId": ObjectID("YYYYYY"),
{
"_id": ObjectID("XXXXXX"),
"more details" :more details
"attendance": [
{
"date": ISODate("2015-08-11T18:30:00.000Z"),
"students": [
{
"studentId": ObjectID("YYYYYY"),
"entryTime": ISODate("1970-01-01T05:41:00.000Z"),
"exitTime": ISODate("1970-01-01T05:41:00.000Z"),
"attendanceStatus": "Present"
},
{
"studentId": ObjectID("ZZZZZZ"),
"entryTime": ISODate("1970-01-01T06:42:00.000Z"),
"exitTime": ISODate("1970-01-01T06:42:00.000Z"),
"attendanceStatus": "Present"
}
]
},
{
"date": ISODate("2015-08-12T18:30:00.000Z"),
"students": [
{
"studentId": ObjectID("XXXXX"),
"entryTime": ISODate("1970-01-01T05:41:00.000Z"),
"exitTime": ISODate("1970-01-01T06:42:00.000Z"),
"attendanceStatus": "Present"
},
{
"studentId": ObjectID("YYYYY"),
"entryTime": ISODate("1970-01-01T05:41:00.000Z"),
"exitTime": ISODate("1970-01-01T06:42:00.000Z"),
"attendanceStatus": "Absent"
}
]
}
]
}
我试图得到一个学生出席的天数和缺席的天数。但我一直得到未定义的输出
var pipeline = [
{
"$match": {_id: mongoose.Types.ObjectId(batchId)}
},
{
"$project": {attendance: '$attendance.students'}
},
{
"$group": {
"studentId": "$studentId"
,
"Present": {
"$sum": {
"$cond": [{"$eq": ["attendanceStatus", "Present"]}, 1, 0]
}
},
"Absent": {
"$sum": {
"$cond": [{"$eq": ["attendanceStatus", "Absent"]}, 1, 0]
}
}
}
}
];
我无法找出我错过了什么请尝试此管道
var pipeline = [{$unwind: '$attendance'},
{$unwind: '$attendance.students'},
{$group: {
_id: '$attendance.students.studentId',
"Present": {
"$sum": {
"$cond": [
{"$eq": ["$attendance.students.attendanceStatus", "Present"]},
1,
0]
}
},
"Absent": {
"$sum": {
"$cond": [
{"$eq": ["$attendance.students.attendanceStatus", "Absent"]},
1,
0]
}
}}}]
正如前面提到的,记录这些数据或数据转换作业的代码显然有一些可怕的错误。虽然在外部数组中有一个主日期,即
ISODate(“2015-08-11T18:30:00.000Z”)
,但内的每个项目似乎只将“小时”添加到纪元日期ISODate(“1970-01-01T05:41:00.000Z”)
中,而不是添加到基准日期中,因为它们可能是ISODate(“2015-08-11T05:41:00.000Z”)
。所以,在它最终咬你之前,你可能会看看它。另外,如果您使用的是MongoDB 3.2,那么还有一种更有效的方法。@BlakesSeven,感谢您提供的信息,我明白您的意思,输入类型“time”默认设置为1970。我会调查的,非常感谢。我们将要迁移到3.2版,有没有关于我应该看什么的建议?