Arrays 每个ID的MongoDB运行日期范围总和
我有以下json文件(小样本),其中包含4个不同客户在不同日期的购买记录。我需要使用MongoDB/nosql来确定哪些客户在连续3天内至少总共购买了8次新产品 在这种情况下,客户ABC在2020-05-01至2020-05-03(连续3天)期间总共购买了32件商品。客户GHI在2020-07-28至2020-07-30(连续3天)期间也有20次购买。因此,我的输出应该只包含客户ABC和GHI。获取输出的代码是什么?非常感谢Arrays 每个ID的MongoDB运行日期范围总和,arrays,json,mongodb,nosql,Arrays,Json,Mongodb,Nosql,我有以下json文件(小样本),其中包含4个不同客户在不同日期的购买记录。我需要使用MongoDB/nosql来确定哪些客户在连续3天内至少总共购买了8次新产品 在这种情况下,客户ABC在2020-05-01至2020-05-03(连续3天)期间总共购买了32件商品。客户GHI在2020-07-28至2020-07-30(连续3天)期间也有20次购买。因此,我的输出应该只包含客户ABC和GHI。获取输出的代码是什么?非常感谢 {"cust_id":"ABC"
{"cust_id":"ABC", "date":"2020-05-01", "new_purchase":2},
{"cust_id":"ABC", "date":"2020-05-02", "new_purchase":16},
{"cust_id":"ABC", "date":"2020-05-03", "new_purchase":14},
{"cust_id":"ABC", "date":"2020-05-04", "new_purchase":0},
{"cust_id":"ABC", "date":"2020-05-05", "new_purchase":5},
{"cust_id":"DEF", "date":"2020-05-11", "new_purchase":3},
{"cust_id":"DEF", "date":"2020-05-12", "new_purchase":0},
{"cust_id":"DEF", "date":"2020-05-13", "new_purchase":0},
{"cust_id":"DEF", "date":"2020-05-14", "new_purchase":0},
{"cust_id":"DEF", "date":"2020-05-15", "new_purchase":1},
{"cust_id":"GHI", "date":"2020-07-28", "new_purchase":0},
{"cust_id":"GHI", "date":"2020-07-29", "new_purchase":3},
{"cust_id":"GHI", "date":"2020-07-30", "new_purchase":17},
{"cust_id":"GHI", "date":"2020-07-31", "new_purchase":0},
{"cust_id":"GHI", "date":"2020-08-01", "new_purchase":1},
{"cust_id":"JKL", "date":"2020-06-04", "new_purchase":7},
{"cust_id":"JKL", "date":"2020-06-05", "new_purchase":0},
{"cust_id":"JKL", "date":"2020-06-06", "new_purchase":0},
{"cust_id":"JKL", "date":"2020-06-07", "new_purchase":0},
{"cust_id":"JKL", "date":"2020-06-08", "new_purchase":0},
{"cust_id":"JKL", "date":"2020-06-08", "new_purchase":2}
我假设这几天不会重复,这似乎是事实,只要你在最后的日期有一个打字错误
这个想法是:
day-1
和day+1
是否存在。如果它们存在,我们将其作为数组添加到集合中,如下所示:集合:[[1,2,3],[2,3,4],[3,4,5]
$unwind
ed,我们可以找到这些天的产品总数total>8
匹配{$group:{{u id:“$id”}
日期真的是一个字符串还是一个ISO日期?为什么你要问同样的问题四次?
[
{
"$group" : {
"_id" : {
"cust_id" : "$cust_id",
"year" : {
"$arrayElemAt" : [
{
"$split" : [
"$date",
"-"
]
},
0
]
},
"month" : {
"$arrayElemAt" : [
{
"$split" : [
"$date",
"-"
]
},
1
]
}
},
"daysAndBuys" : {
"$push" : {
"day" : {
"$convert" : {
"input" : {
"$arrayElemAt" : [
{
"$split" : [
"$date",
"-"
]
},
2
]
},
"to" : "int"
}
},
"buys" : "$new_purchase"
}
}
}
},
{
"$addFields" : {
"sets" : {
"$map" : {
"input" : "$daysAndBuys",
"as" : "d",
"in" : {
"$cond" : [
{
"$and" : [
{
"$in" : [
{
"$add" : [
"$$d.day",
1
]
},
"$daysAndBuys.day"
]
},
{
"$in" : [
{
"$subtract" : [
"$$d.day",
1
]
},
"$daysAndBuys.day"
]
}
]
},
[
"$$d.day",
{
"$add" : [
"$$d.day",
1
]
},
{
"$subtract" : [
"$$d.day",
1
]
}
],
""
]
}
}
}
}
},
{
"$addFields" : {
"sets" : {
"$filter" : {
"input" : "$sets",
"as" : "s",
"cond" : {
"$ne" : [
"$$s",
""
]
}
}
}
}
},
{
"$unwind" : "$sets"
},
{
"$addFields" : {
"daysAndBuys" : {
"$filter" : {
"input" : "$daysAndBuys",
"as" : "data",
"cond" : {
"$in" : [
"$$data.day",
"$sets"
]
}
}
}
}
},
{
"$project" : {
"daysAndBuys" : 1,
"total" : {
"$sum" : "$daysAndBuys.buys"
}
}
},
{
"$match" : {
"total" : {
"$gte" : 8
}
}
}
]