Mongo聚合$减去动态文档值之间的差值

时间:2015-03-11 18:38:26

标签: mongodb aggregation-framework

需要根据两个日期的患者ID找到两个出勤值之间的差异,分组为ward_id。结果具有基于数组的动态值。差异在两个日期之间。关键是ward_id,差异将在患者访问病房的计数之间。

示例样本数据

    {
    "_id" : {
        "type" : "patient_attendence",
        "ts" : ISODate("2015-02-03T21:31:29.902Z"),
        "ward_id" : 2561
    },
    "count" : 4112,
    "values" : [ 
        {
            "count" : 9,
            "patient" : ObjectId("54766f973f35473ffc644618")
        }, 
        {
            "count" : 19,
            "patient" : ObjectId("546680e2d660e2dc5ebfea39")
        }, 
        {
            "count" : 47,
            "patient" : ObjectId("546680e3d660e2dc5ebfea72")
        }, 
        {
            "count" : 1,
            "patient" : ObjectId("546a137bdab5f21e612ea7ef")
        }, 
        {
            "count" : 93,
            "patient" : ObjectId("546680e3d660e2dc5ebfea89")
        }
    ]
}

{
    "_id" : {
        "type" : "patient_attendence",
        "ts" : ISODate("2015-02-03T21:31:29.902Z"),
        "ward_id" : 3720
    },
    "count" : 1,
    "values" : [ 
        {
            "count" : 1,
            "patient" : ObjectId("546a136ddab5f21e612ea6a6")
        }
    ]
}

{
    "_id" : {
        "type" : "patient_attendence",
        "ts" : ISODate("2015-02-04T21:31:29.902Z"),
        "ward_id" : 2561
    },
    "count" : 4112,
    "values" : [ 
        {
            "count" : 10,
            "patient" : ObjectId("54766f973f35473ffc644618")
        }, 
        {
            "count" : 10,
            "patient" : ObjectId("546680e2d660e2dc5ebfea39")
        }, 
        {
            "count" : 6,
            "patient" : ObjectId("5474e9e46606f32570fa48ff")
        }, 
        {
            "count" : 1,
            "patient" : ObjectId("5474e9e36606f32570fa48f2")
        }, 
        {
            "count" : 1,
            "patient" : ObjectId("546680e3d660e2dc5ebfea77")
        }, 
        {
            "count" : 543,
            "patient" : ObjectId("546680e2d660e2dc5ebfea43")
        }, 
        {
            "count" : 1,
            "patient" : ObjectId("5485fdc8d27a9122956b1c66")
        }
    ]
}

{
    "_id" : {
        "type" : "patient_attendence",
        "ts" : ISODate("2015-02-04T21:31:29.902Z"),
        "ward_id" : 3720
    },
    "count" : 1,
    "values" : [ 
        {
            "count" : 7,
            "patient" : ObjectId("546a136ddab5f21e612ea6a6")
        }
    ]
} 

输出

{
  "ward_id":2561,
   "result" : [{"person":  ObjectId("54766f973f35473ffc644618"),
  "count_1": 9,
  "count_1": 10,
  "difference":1 },{"person":  ObjectId("546680e2d660e2dc5ebfea39"),
  "count_1": 19,
  "count_1": 10,
  "difference":-9 } ....]
},

{
  "ward_id":3720,
   "result" : [{"person":  ObjectId("546a136ddab5f21e612ea6a6"),
  "count_1": 9,
  "count_1": 10,
  "difference":1 },{"person":  ObjectId("546680e2d660e2dc5ebfea39"),
  "count_1": 1,
  "count_1": 7,
  "difference":-6 }]
}

1 个答案:

答案 0 :(得分:0)

您可以使用此处概述的聚合框架$subtract运算符:http://docs.mongodb.org/manual/reference/operator/aggregation-arithmetic/

db.wards.aggregate([
  {
    $match: {id: {$elemMatch: {ward_id: my_ward_id, ts: my_desired_ts}}},
  },
  {
    $limit: 2
  },
  {
    $project: {values: 1}
  },
  {
    $unwind: '$values'
  },
  {
    $match: {patient: my_patient_id}
  },
  {
    $group: {
      _id: null,
      'count1': {$first: '$values.count'},
      'count2': {$last: '$values.count'}
    }
  },
  {
    $subtract: ['$count1', '$count2']
  }
])

我还没有对此进行测试,但它可能看起来像是