上一篇笔记仅是记录了一下简单的关联查询,根据笔记中的场景:将某一车辆关联的耗损记录所有放在了一个字段当中。不知道如今中有没有这种场景,咱们的应用中没有相似的场景,可能咱们更关注的是某车辆的总耗损金额和总营收金额、总里程数等,所以这篇笔记记录一下怎么获得这些数据。要想获取这些记录咱们首先想到的就是先按照车辆ID分组以后再对指定字段求和,多是先入为主的缘由(有了上一篇笔记),我没有按照传统的思路走下去,而是想着看看能不能在上一篇笔记的基础之上获得想要的结果。mongodb
咱们沿着这条路在分析一下,车辆相关的耗损和营收均可以放到一个字段中。也就是说咱们不用分组了,车辆相关的耗损和营收记录都冗余到了车辆信息记录中,那么接下来就是对数组中的某一字段或者多个进行求和了……查了半天并无找到相似$sum这样的聚合管道能够对数组中的字段求和,不过得益于mongodb管道的强大,用另一个管道间接实现了这个功能。数组
db.getCollection('FormInstace').aggregate([ { $match: { "_id": { $in: ["1","2","3"] }, "FormItems.key": { $ne: null } } }, { $addFields: { FormValueObj: { $arrayToObject: { $map: { input: "$FormItems", as: "field", in: [ "$$field.key", "$$field.value" ] } } } } }, { $replaceRoot: { newRoot: { $mergeObjects: [ "$FormValueObj", "$$ROOT" ] } } }, { $project: { FormItems:0, FormValueObj:0 } }, { $lookup:{ from:"FormInstace", let: { tempMainRelationKey: "$_id" }, pipeline:[ { $match: { FormId: "507048044944692000", "FormItems.key": { $ne: null } } }, { $addFields: { FormValueObj: { $arrayToObject: { $map: { input: "$FormItems", as: "field", in: [ "$$field.key", "$$field.value" ] } } } } }, { $replaceRoot: { newRoot: { $mergeObjects: [ "$FormValueObj", "$$ROOT" ] } } }, { $project: { FormItems:0, FormValueObj:0 } }, { $match: { $expr: { $eq: [ "$1572493552001.id","$$tempMainRelationKey" ] } } }, ], as:'carWastage' } }, { $lookup:{ from:"FormInstace", let: { tempMainRelationKey: "$_id" }, pipeline:[ { $match: { FormId: "507048044944693000", "FormItems.key": { $ne: null } } }, { $addFields: { FormValueObj: { $arrayToObject: { $map: { input: "$FormItems", as: "field", in: [ "$$field.key", "$$field.value" ] } } } } }, { $replaceRoot: { newRoot: { $mergeObjects: [ "$FormValueObj", "$$ROOT" ] } } }, { $project: { FormItems:0, FormValueObj:0 } }, { $match: { $expr: { $eq: [ "$1572493553001.id","$$tempMainRelationKey" ] } } }, ], as:'carRevenue' } }, { $addFields: { carWastageStatistics: { $reduce: { input: "$carWastage", initialValue: {wastageMoney:0}, in: { wastageMoney:{ $add : ["$$value.wastageMoney", "$$this.1572493552005"] } } } } } }, { $addFields: { carRevenueStatistics: { $reduce: { input: "$carRevenue", initialValue: {revenueMoney:0,mileage:0}, in: { revenueMoney:{$add : ["$$value.revenueMoney", "$$this.1572493553005"]}, mileage:{$add : ["$$value.mileage", "$$this.1572493553006"]} } } } } } ]);
此次统计查询就查出了某些车辆的总耗损金额和总营收金额、总里程数;只不过将结果放到对象中了(方便统计一个表中的多个字段),可是如今看不到具体的结果,将代码在修改一下,看一下结果ide
db.getCollection('FormInstace').aggregate([ { $match: { "_id": { $in: ["1","2","3"] }, "FormItems.key": { $ne: null } } }, { $addFields: { FormValueObj: { $arrayToObject: { $map: { input: "$FormItems", as: "field", in: [ "$$field.key", "$$field.value" ] } } } } }, { $replaceRoot: { newRoot: { $mergeObjects: [ "$FormValueObj", "$$ROOT" ] } } }, { $project: { FormItems:0, FormValueObj:0 } }, { $lookup:{ from:"FormInstace", let: { tempMainRelationKey: "$_id" }, pipeline:[ { $match: { FormId: "507048044944692000", "FormItems.key": { $ne: null } } }, { $addFields: { FormValueObj: { $arrayToObject: { $map: { input: "$FormItems", as: "field", in: [ "$$field.key", "$$field.value" ] } } } } }, { $replaceRoot: { newRoot: { $mergeObjects: [ "$FormValueObj", "$$ROOT" ] } } }, { $project: { FormItems:0, FormValueObj:0 } }, { $match: { $expr: { $eq: [ "$1572493552001.id","$$tempMainRelationKey" ] } } }, ], as:'carWastage' } }, { $lookup:{ from:"FormInstace", let: { tempMainRelationKey: "$_id" }, pipeline:[ { $match: { FormId: "507048044944693000", "FormItems.key": { $ne: null } } }, { $addFields: { FormValueObj: { $arrayToObject: { $map: { input: "$FormItems", as: "field", in: [ "$$field.key", "$$field.value" ] } } } } }, { $replaceRoot: { newRoot: { $mergeObjects: [ "$FormValueObj", "$$ROOT" ] } } }, { $project: { FormItems:0, FormValueObj:0 } }, { $match: { $expr: { $eq: [ "$1572493553001.id","$$tempMainRelationKey" ] } } }, ], as:'carRevenue' } }, { $addFields: { carWastage_Money: { $reduce: { input: "$carWastage", initialValue: 0, in: { $add : ["$$value", "$$this.1572493552005"] } } } } }, { $addFields: { carRevenue_Money: { $reduce: { input: "$carRevenue", initialValue: 0, in: { $add : ["$$value", "$$this.1572493553005"] } } } } }, { $addFields: { carRevenue_Mileage: { $reduce: { input: "$carRevenue", initialValue: 0, in: { $add : ["$$value", "$$this.1572493553006"] } } } } } ]);
这样就一目了然了。统计结果对不对呢?咱们用传统的分组以后再求和在查询一下,将结果作一下对比(顺便记录一下,分组求和)this
db.getCollection('FormInstace').aggregate([ { $match: { "FormId":"507048044944692000", "FormItems.key": { $ne: null } } }, { $addFields: { FormValueObj: { $arrayToObject: { $map: { input: "$FormItems", as: "field", in: [ "$$field.key", "$$field.value" ] } } } } }, { $replaceRoot: { newRoot: { $mergeObjects: [ "$FormValueObj", "$$ROOT" ] } } }, { $match: { "1572493552001.id": { $in:["1","2","3"]} } }, { $project: { FormItems:0, FormValueObj:0 } }, { $group:{ _id: "$1572493552001.id", wastageMoney: { $sum: "$1572493552005"} } }, { $sort : { _id: 1 } } ]);
db.getCollection('FormInstace').aggregate([ { $match: { "FormId":"507048044944693000", "FormItems.key": { $ne: null } } }, { $addFields: { FormValueObj: { $arrayToObject: { $map: { input: "$FormItems", as: "field", in: [ "$$field.key", "$$field.value" ] } } } } }, { $replaceRoot: { newRoot: { $mergeObjects: [ "$FormValueObj", "$$ROOT" ] } } }, { $match: { "1572493553001.id": { $in:["1","2","3"]} } }, { $project: { FormItems:0, FormValueObj:0 } }, { $group:{ _id: "$1572493553001.id", wastageMoney: { $sum: "$1572493553005"}, mileage: { $sum: "$1572493553006"} } }, { $sort : { _id: 1 } } ]);
对比两次查询结果,两次不一样的统计方式的结果相同。这样就放心了。好了就到这里了。spa