我有一个输出的mongodb查询:
{"patientId" : "100", "action" : "DIAGNOSED", "date" : ISODate("2016-05-10T13:30:09Z")}
{"patientId" : "100", "action" : "DIAGNOSED", "date" : ISODate("2016-05-25T14:30:09Z")}
{"patientId" : "215", "action" : "DIAGNOSED", "date" : ISODate("2017-03-02T13:30:09Z")}
{"patientId" : "215", "action" : "DIAGNOSED", "date" : ISODate("2017-03-17T14:30:09Z")}
{"patientId" : "380", "action" : "PATIENT IN", "date" : ISODate("2017-02-03T13:30:09Z")}
{"patientId" : "380", "action" : "PATIENT IN", "date" : ISODate("2017-02-05T14:30:09Z")}
我需要能够循环使用这个,以便如果患者是'并且'行动'是相同的,我希望能够做某事(例如找到两个日期之间的差异)。
我基本上想知道患者需要多长时间才能完成一个动作然后找到平均值。因此,对于患者100我 - 我的行动':'诊断'我得到时差。然后,我会为患者提供相同的帮助'对于'动作':'已诊断'。既然这些都是诊断的,我会找到时间差的平均值。 ' patientId' 380将是单独平均值的一部分,因为该行为是“患者IN”,
我的整个查询有8种不同的动作类型和500个patientIds。我不确定我是否可以在mongo中完成所有操作,或者我是否需要编写一些javascript来执行循环,因为我需要每种操作类型的平均时间。我看到如何在mongo中对特定值进行匹配,但不仅仅是"如果它们是相同的......请执行此操作"一种功能。
答案 0 :(得分:2)
使用MongoDB Aggregation Framework,您可以创建解决初始问题的操作管道。也许你也可以考虑为" patientId"创建合适的索引。和"行动"如果你遇到了性能问题。
我还添加了一些其他属性,只是为了让您有机会更深入地了解它的工作原理。例如, totalPatientInvolved 是分组记录的计数器, captureInvolved 是从所有Capture填充的数组。
db.stackoverflow001.aggregate([
{
$group: {
_id: {
patientId: "$patientId",
action:"$action"
},
startAt: {$min: "$date"},
endAt: {$max: "$date"}
}
},
{
$addFields: {
dateDiff: {$subtract:["$endAt","$startAt"]}
}
},
{
$group: {
_id: {
action: "$_id.action"
},
averageTimeInMilliseconds: {$avg:"$dateDiff"},
averageTimeInDays: {$avg: {$divide: [{$divide: [{$divide: [{$divide:["$dateDiff", 1000]}, 60]}, 60]}, 24]}},
totalPatientInvolved: {$sum: 1},
captureInvolved: {$push: "$$ROOT"}
}
}
]);