这就是我进行汇总查询的方式,以获取开始时间和结束时间之间的平均时间(格式均为ISODate("2020-02-24T13:08:00.123Z")
)。
但是我需要将结果数据分为两组,因为我需要获取开始时间为04/2019-09/2020的所有数据集的平均数据,第二组为开始时间为10/2019-04 /的所有数据。 2020年。 我不知道如何将这两个间隔归为一个ISODate值
const data = await Data.aggregate([
{
$match: {
type: { $exists: true },
statsIgnore: { $exists: false }
}
},
{
$group: {
_id: '$type',
Datasets: { $sum: 1 },
Average: {
$avg: {
$divide: [
{ $subtract: ['$timeEnd', '$timeStart'] },
60000
]
}
}
}
}
]).toArray()
我的数据结构
[
{
_id: ObjectId("5d9242cf863feb0b8d70d12e"),
timeStart: ISODate("2020-02-24T13:08:00.123Z"),
timeEnd: ISODate("2020-02-24T13:18:00.123Z"),
type: 'type1'
},
{
_id: ObjectId("5d9242cf863feb0b8d70d12f"),
timeStart: ISODate("2019-08-29T17:05:00.123Z"),
timeEnd: ISODate("2019-08-29T17:25:00.123Z"),
type: 'type1'
}
]
在这个简单的数据示例中,只有一种类型,其中夏季有一个数据集,冬季有一个数据集。
因此,结果应该是冬季平均10分钟,夏季平均20分钟(对于1型组)。
答案 0 :(得分:1)
我采取的方法是检查timeStart在初始$ match阶段要寻找的范围内。然后,我添加了一个$ addFields阶段,根据开始日期检查季节是否为夏季。然后,我按新的summer
字段分组。
[
{$match: {
type: {
$exists: true
},
statsIgnore: {
$exists: false
},
timeStart: {
$gte: ISODate("2019-04-01T00:00:00Z"),
$lt: ISODate("2020-04-01T00:00:00Z")
}
}},
{$addFields: {
summer: { $lt: ["$timeStart", ISODate("2019-09-01T00:00:00Z")]}
}},
{$group: {
_id: "$summer",
Average: {
$avg: {
$divide: [
{ $subtract: ['$timeEnd', '$timeStart'] },
60000
]
}
}
}}]
答案 1 :(得分:0)
检查是否符合您的要求:
db.data.aggregate([
{
$match: {
type: {
$exists: true
},
statsIgnore: {
$exists: false
}
}
},
{
$group: {
_id: {
type: "$type",
season: {
$arrayElemAt: [
[
"None",
"Winter",
"Winter",
"Spring",
"Spring",
"Spring",
"Summer",
"Summer",
"Summer",
"Autumn",
"Autumn",
"Autumn",
"Winter"
],
{
$month: "$timeStart"
}
]
}
},
Datasets: {
$sum: 1
},
Average: {
$avg: {
$divide: [
{
$subtract: [
"$timeEnd",
"$timeStart"
]
},
60000
]
}
}
}
}
])