gpt4 book ai didi

MongoDb - 聚合 : How to get Grand Totals with Individual, 未分组记录?

转载 作者:可可西里 更新时间:2023-11-01 10:39:53 27 4
gpt4 key购买 nike

假设我们有这样的文档:

{ type: "hourly", amount: 100 },
{ type: "flat", amount: 350 },
{ type: "hourly", amount: 200 },
{ type: "payment", amount: 100 },
{ type: "payment", amount: 200 }

在管道的某处,我想为每个“类型”累积总计。 连同所有个人记录,我想知道我们的总计如下:

hourly:  $300
flat: $350
payment: $300

我查看了 $add$sum,它们似乎对为给定记录添加字段很有用,但对累计总计没有帮助。

到目前为止,我的聚合过滤了我想要的所有记录并且没有使用分组。我不想对记录进行分组。我需要个人记录以及总计。

我相信 $push 命令可能是相关的,如果我必须 $group - 可能是为了 $push - 将个人记录放入一个数组,用于将其与所有其余记录一起取出。在这里查看答案:Using Mongo aggregation to calculate sum of values

在我的例子中,我有一个汇总,但没有收集任何总数,如下所示。对于每个返回的文档,都有一个“类型”字段(例如,“每小时”、“固定”、“付款”)。

myAggregate = [
{ $sort: { date: -1 } },
{
$match: query
},
{
$lookup: {
from: "contacts", // collection name in db
localField: "billerId",
foreignField: "_id",
as: "biller"
}
},
{
$unwind: "$biller"
},
{
$lookup: {
from: "matters", // collection name in db
localField: "matterId",
foreignField: "_id",
as: "matter"
}
},
{
$unwind: "$matter"
},
{
$lookup: {
from: "contacts", // collection name in db
localField: "matter.clientId",
foreignField: "_id",
as: "client"
}
},
{
$unwind: "$client"
},
];

为了累积总计并返回所有单独(未分组)记录,“myAggregate”会是什么样子?

事后思考:如果“手动”遍历记录以获得总计对我来说同样有效,我可以这样做。我假设 MongoDb 这样做一定更有效,因为他们费心制作这些类型的功能。

编辑 1:

以下是根据 Veeram 的建议附加“myAggregate”的方式:

// Do we need to get only records which match the matter's contactId?
if (query2 != "") {
myAggregate.push( { $match: query2 } );
}

// Get grand totals.
myAggregate.push({ "$group": { "_id": "$transactionType",
"documents": { "$push": "$$ROOT" },
"grandtotal": {"$sum":"$amount"}
}
});

最佳答案

在 Veeram 的帮助下,我还通过添加 project 获得了总数group 之前的阶段他建议的阶段。我还设置了 group的 _id 为 null(根据 Mongo documentation )以避免将我的所有文档分成几组。

    $project: {
_id: 1,
firmId: 1,

... plus, a bunch more fields.

// Project some fields to allow totaling by transactionType.
hourlyAmount: { $cond: { if: { $eq: ["$transactionType", "hourly"] }, then: "$amount", else: 0 } },
flatAmount: { $cond: { if: { $eq: ["$transactionType", "flat"] }, then: "$amount", else: 0 } },
paymentAmount: { $cond: { if: { $eq: ["$transactionType", "payment"] }, then: "$amount", else: 0 } },
expenseAmount: { $cond: { if: { $eq: ["$transactionType", "expense"] }, then: "$amount", else: 0 } },
creditAmount: { $cond: { if: { $eq: ["$transactionType", "credit"] }, then: "$amount", else: 0 } },
debitAmount: { $cond: { if: { $eq: ["$transactionType", "debit"] }, then: "$amount", else: 0 } }

}

然后,根据 Veeram,我分组如下:

myAggregate.push({
"$group": {
"_id": null, //"$transactionType",
"documents": { "$push": "$$ROOT" },
"hourlyTotal": {"$sum": "$hourlyAmount"},
"flatTotal" : {"$sum": "$flatAmount"},
"paymentTotal" : {"$sum": "$paymentAmount"},
"expenseTotal" : {"$sum": "$expenseAmount"},
"creditTotal" : {"$sum": "$creditAmount"},
"debitTotal" : {"$sum": "$debitAmount"},
}
});

它工作得很漂亮,所有的东西都作为一个只有一个元素的数组返回。请注意,“文档”是数组元素的一个属性,因此它们可以被 <arrayElements>[0] 引用.文件。我所有的个人总数都在那里(例如,arrayElements>[0].hourlyTotal)。

关于MongoDb - 聚合 : How to get Grand Totals with Individual, 未分组记录?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48139694/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com