MongoDB添加自定义字段



这是我的收藏。它由用户和他们的数据组成

{
userId: 6udg,
data: [
{
date: 22-09-2022
hits: 98
},
{
date: 23-09-2022
hits: 88
},
{
date: 24-09-2022
hits: 100
},
{
date: 24-11-2022
hits: 145
},
{
date: 25-11-2022
hits: 75
}            
]
},
{
userId:  7tu5,
data: [
{
date: 22-09-2022
hits: 98
},
{
date: 23-09-2022
hits: 88
},
{
date: 24-09-2022
hits: 100
},
{
date: 24-11-2022
hits: 18
},
{
date: 25-11-2022
hits: 65
}           
]
}

下面是我如何创建一个按周,月和年过滤的命中对象的聚合。首先匹配要获取其数据的用户。然后我使用投影来获得我想要的自定义字段。

Users.aggregate([
{
$match: {
userId: req.params.userId
}
},
{
$project: {
_id: 0,
last_seven_days: {
$filter: {
input: "$data",
as: "index", 
cond: {
$and: [
{
$gte: [
"$$index.date",
new Date(moment().utc().startOf("week"))
]
},
{
$lte: [
"$$index.date",
new Date(moment().utc().endOf("week"))
]
}
]
}
},
},
last_month: {
$filter: {
input: "$data",
as: "index", 
cond: {
$and: [
{
$gte: [
"$$index.date",
new Date(moment().utc().startOf("month"))
]
},
{
$lte: [
"$$index.date",
new Date(moment().utc().endOf("month"))
]
}
]
}
}
},
last_year: {
$filter: {
input: "$data",
as: "index",
cond: {
$and: [
{
$gte: [
"$$index.date",
new Date(moment().utc().startOf("year"))
]
},
{
$lte: [
"$$index.date",
new Date(moment().utc().endOf("month"))
]
}
]
}
}
}
}
}
])

我想做的是在每个lastrongeven_days中添加一个名为"average"的键,last_monthlast_year-分别包含周、月和年的平均点击率

预期输出:

{
userId: 6udg
last_seven_day:[ 
avg: <avg>
data:[
{
date:  24-11-2022,
hits: 145,
},
{
date:  25-11-2022,
hits: 75,
}
]
]
}


您可以简单地添加另一个投影步骤:

db.collection.aggregate([
{
$project: {
last_seven_day: {
data: "$last_seven_day_arr",
avg: {
$avg: "$last_seven_day_arr.hits"
}
},
last_month: {
data: "$last_month_arr",
avg: {
$avg: "$last_month_arr.hits"
}
},
last_year: {
data: "$last_year_arr",
avg: {
$avg: "$last_year_arr.hits"
}
}
}
}
])

看看它是如何在操场上工作的

您可以先使用$filter来过滤记录。然后使用另一个$avg计算过滤后的平均结果。

db.collection.aggregate([
{
"$match": {
userId: "6udg"
}
},
{
"$addFields": {
"last_seven_days": {
data: {
"$filter": {
"input": "$data",
"as": "d",
"cond": {
$lt: [
{
"$dateDiff": {
"startDate": "$$d.date",
"endDate": "$$NOW",
"unit": "day"
}
},
7
]
}
}
}
},
"last_month": {
data: {
"$filter": {
"input": "$data",
"as": "d",
"cond": {
$lt: [
{
"$dateDiff": {
"startDate": "$$d.date",
"endDate": "$$NOW",
"unit": "month"
}
},
1
]
}
}
}
},
"last_year": {
data: {
"$filter": {
"input": "$data",
"as": "d",
"cond": {
$lt: [
{
"$dateDiff": {
"startDate": "$$d.date",
"endDate": "$$NOW",
"unit": "year"
}
},
1
]
}
}
}
}
}
},
{
"$addFields": {
"last_seven_days": {
avg: {
$avg: "$last_seven_days.data.hits"
}
},
"last_month": {
avg: {
$avg: "$last_month.data.hits"
}
},
"last_year": {
avg: {
$avg: "$last_year.data.hits"
}
}
}
}
])

Mongo操场

最新更新