Database
[{"_id":ObjectId("5a934e000102030405000000"),"run_id":"run_x","measurements":{"true_positives":5,"false_positives":1}},{"_id":ObjectId("5a934e000102030405000001"),"run_id":"run_y","measurements":{"true_positives":6,"false_positives":0}},{"_id":ObjectId("5a934e000102030405000002"),"run_id":"run_z","measurements":{"true_positives":4,"false_positives":2}},{"_id":ObjectId("5a934e000102030405000003"),"run_id":"run_za","measurements":{"true_positives":5,"false_positives":2}}]
Query
db.collection.aggregate([{$sort:{run_id:-1}},{$lookup:{from:"collection",let:{prev_value:"$$ROOT"},pipeline:[{$sort:{run_id:-1}},{$match:{$expr:{$lt:["$run_id","$$prev_value.run_id"]}}},{$limit:1}],as:"next_measure"}},{$addFields:{tmp:{$arrayElemAt:["$next_measure",0]}}},{$project:{_id:0,run_id:1,measurements:{true_positives:1,tp_delta:{$ifNull:[{$subtract:["$measurements.true_positives","$tmp.measurements.true_positives"]},0]},false_positives:1,fp_delta:{$ifNull:[{$subtract:["$measurements.false_positives","$tmp.measurements.false_positives"]},0]}}}},{$sort:{run_id:1}}])