Mongo 动态文档值之间的聚合 $subtract

Mongo aggregation $subtract between dynamic document value

需要根据两个日期的患者 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 }]
}

您可以使用此处概述的聚合框架的 $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']
  }
])

我还没有测试过这个,但它可能看起来像上面的东西