表单生成器(FormBuilder)之mongodb表单数据查询——统计查询求和du

database

  上一篇笔记仅是记录了一下简单的关联查询,根据笔记中的场景:将某一车辆关联的耗损记录全部放在了一个字段当中。不知道现在中有没有这种场景,我们的应用中没有类似的场景,可能我们更关注的是某车辆的总耗损金额和总营收金额、总里程数等,因此这篇笔记记录一下怎么得到这些数据。要想获取这些记录我们首先想到的就是先按照车辆ID分组之后再对指定字段求和,可能是先入为主的原因(有了上一篇笔记),我没有按照传统的思路走下去,而是想着看看能不能在上一篇笔记的基础之上得到想要的结果。

  我们沿着这条路在分析一下,车辆相关的耗损和营收都可以放到一个字段中。也就是说我们不用分组了,车辆相关的耗损和营收记录都冗余到了车辆信息记录中,那么接下来就是对数组中的某一字段或者多个进行求和了……查了半天并没有找到类似$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"]}

}

}

}

}

}

]);

  这次统计查询就查出了某些车辆的总耗损金额和总营收金额、总里程数;只不过将结果放到对象中了(方便统计一个表中的多个字段),但是现在看不到具体的结果,将代码在修改一下,看一下结果

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"] }

}

}

}

}

]);

  这样就一目了然了。统计结果对不对呢?我们用传统的分组之后再求和在查询一下,将结果做一下对比(顺便记录一下,分组求和)

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 } }

]);

统计指定车辆的营收总额和里程数

  对比两次查询结果,两次不同的统计方式的结果相同。这样就放心了。好了就到这里了。

以上是 表单生成器(FormBuilder)之mongodb表单数据查询——统计查询求和du 的全部内容, 来源链接: utcz.com/z/531314.html

回到顶部