mongodb - 给定 id 不重复的 MongoDB 计数
问题描述
我是 Mongodb 的初学者,并在下面给出了我的数据
{ "client_id" : 1, "invoice":[{"invoice_date" : "20-07-2020", "invoice_month" : "July 2020","account_status" : "Active"}]}
{ "client_id" : 1, "invoice":[{"invoice_date" : "20-07-2020", "invoice_month" : "July 2020","account_status" : "Active"}]}
{ "client_id" : 1, "invoice":[{"invoice_date" : "30-07-2020", "invoice_month" : "July 2020","account_status" : "Active"}]}
{ "client_id" : 2, "invoice":[{"invoice_date" : "03-08-2020", "invoice_month" : "August 2020","account_status" : "Active"}]}
{ "client_id" : 2, "invoice":[{"invoice_date" : "05-05-2020", "invoice_month" : "August 2020","account_status" : "Active"}]}
{ "client_id" : 3, "invoice":[{"invoice_date" : "10-06-2020", "invoice_month" : "June 2020","account_status" : "Active"}]}
我想计算没有所有重复值并在下面提到预期结果
{"client_id": 2 , "invoice_month" : "August 2020", "count": 1}
{"client_id": 1 , "invoice_month" : "July 2020", "count": 1}
{"client_id": 3 , "invoice_month" : "June 2020", "count": 1}
在这里,我在下面使用聚合,但它计数所有重复
[
{
"$match": {
"client_id": "1",
"invoice.account_status": "Active"
}
},
{
"$unwind": "$invoice"
},
{
"$group": {
"_id": '$invoice.invoice_month',
"count": {"$sum": 1}
}
}
]
解决方案
下面提到的阶段将帮助您达到预期的结果
db.collection.aggregate([
{
"$match": { //Considering only active accounts
"invoice.account_status": "Active"
}
},
{
"$unwind": "$invoice" // reshaping the invoices
},
{
$project: { //Converting string to date
"invoice_date": {
$dateFromString: {
dateString: "$invoice.invoice_date",
"format": "%d-%m-%Y"
}
},
"client_id": 1
}
},
{
$sort: { //getting the latest invoice
"invoice_date": -1
}
},
{
"$group": { //reshaping again to group the result
"_id": "$client_id",
"data": { //Only first record
$first: "$$ROOT"
}
}
},
{
$project: {//Projecting what is needed
"_id": 0,
"client_id": "$data.client_id",
"invoice_date": "$data.invoice_date"
}
}
])
如果您想在输出中保留日期作为字符串,您可以更改最后一个阶段,如下所示
{
$project: {
"_id": 0,
"client_id": "$data.client_id",
"invoice_date": {
"$dateToString": {
date: "$data.invoice_date"
}
}
}
}
推荐阅读
- angular - 无法使用 ng-repeat 获取下拉列表中的数据
- github - Github 操作:即使上一步失败,也有条件地运行步骤
- c# - 将文本分配给变量 webdriver
- python - 如果它们匹配,则将数据框中的单词更改为来自不同数据框中的不同单词
- java - 如何将 Java 枚举与 Amazon DynamoDB 和 AWS SDK v2 结合使用?
- flutter - 无法加载文件列表的内容:'/Target Support Files/Pods-Runner/Pods-Runner-frameworks-Debug-input-files.xcfilelist'。Flutter M1 芯片
- opencv - EMD(推土机距离)HSV vs BGR
- python-3.x - 为什么concurrent.futures.ProcessPoolExecutor/ThreadPoolExecutor的map比multiprocessing.Pool慢?
- tensorflow2.0 - 为什么我们需要在 tensorflow-lite 中调用 MicroInterpreter 之前为特定模型定义 MicroMutableOpResolver 或 AllOpsResolver?
- sql - 如何编写返回一年第二季度的查询.....示例从 2011 年到 2016 年第二季度的总利润