如何解决如何根据日期,星期和月份范围限制流水线的结果?
我有一条管道,可以每天,每周和每月根据属于某个公司的玩家为我提供结果。我在仪表板上有一个日期过滤器,它提供了一个iso日期范围。我想根据日期过滤器限制或排列结果吗?有什么办法可以在管道中做到这一点?
if (chartType === 'Daily') {
statsPipelineCondition = {
_id: { day: { $dayOfMonth: '$createdAt' },month: { $month: '$createdAt' },year: { $year: '$createdAt' } },};
sortCondition = { '_id.year': 1,'_id.month': 1,'_id.day': 1 };
} else if (chartType === 'Monthly') {
statsPipelineCondition = {
_id: { month: { $month: '$createdAt' },'_id.month': 1 };
} else {
statsPipelineCondition = {
_id: { week: { $week: '$createdAt' },'_id.week': 1 };
}
const statsPipeline = [
{
$group: {
...statsPipelineCondition,TOTAL: { $sum: 1 },XR: { $sum: { $cond: [{ $in: ['$company',['XR','CR','DX']] },1,0] } },CT: { $sum: { $cond: [{ $eq: ['$company','CT'] },MR: { $sum: { $cond: [{ $eq: ['$company','MR'] },MG: { $sum: { $cond: [{ $in: ['$company',['NM','MM','MG']] },},{
$sort: {
...sortCondition,];
日期过滤器:
datefilter - { '$gte': '2020-09-01T04:49:50.899Z','$lte': '2020-11-03T04:49:50.899Z' }
解决方法
您需要在$match
阶段之前添加一个$group
阶段,以根据范围对我们进行过滤:
let datefilter = {
'$gte': new Date('2020-09-01T04:49:50.899Z'),'$lte': new Date('2020-11-03T04:49:50.899Z')
};
const statsPipeline = [
{
$match: {
createdAt: datefilter
}
},{
$group: {
...statsPipelineCondition,TOTAL: { $sum: 1 },XR: { $sum: { $cond: [{ $in: ['$company',['XR','CR','DX']] },1,0] } },CT: { $sum: { $cond: [{ $eq: ['$company','CT'] },MR: { $sum: { $cond: [{ $eq: ['$company','MR'] },MG: { $sum: { $cond: [{ $in: ['$company',['NM','MM','MG']] },},{
$sort: {
...sortCondition,];
,
好的,所以出于某种原因。 MongoDB不喜欢字符串中的日期。如果仅由聚合框架提供的运算符来转换字符串,那会更好。
{
$match: {
$expr: {
$and: [
{
$gte: [
'$createdAt',{
$dateFromString: {
dateString: dateFilter.$gte,],{
$lte: [
'$createdAt',{
$dateFromString: {
dateString: dateFilter.$lte,
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。