实际上我有两个日期范围,一个是实际日期范围,另一个是比较日期范围。对于每个日期范围,我正在执行两个不同的查询。
我选择了聚合方法。我为每个日期范围编写的代码是..
$resultsetpre = $db_1->command(array(
'aggregate' => 'ACCOUNT_PERFORMANCE',
'pipeline' => array(
array(
'$match' => array('Date' => array('$gte'=>$actualstartdate,'$lte'=>$actualenddate))
),
array('$group' => array(
'_id' => "$Id",
'Clicks' => array('$sum' => '$Clicks'),
'Impressions' => array('$sum' => '$Impressions'),
'Cost' => array('$sum' => '$Cost'),
'Conversions' => array('$sum' => '$Conversions'),
))
),
));
我的疑问是我是否可以编写一个查询,以便在差异列中获取两个日期范围的数据。由于我有太多的记录,所以需要很长时间。
如果有人帮助我,我非常感谢。提前谢谢。
听起来您想比较两个不同日期范围的点击次数(或其他总和)。 可以将其视为按天进行聚合。 而不是天数,您将日期转换为范围 1、范围 2 或其他,并按这些值分组。
以下示例可帮助您开始比较两个日期范围:开始 1-结束 1、开始 2-结束 2:
project = { "$project" : {
"clicks" : 1,
"range" : { "$cond" : [ { "$and" : [
{ "$gt":["$Date",start1] },
{ "$lt":["$Date",end1] }
]
},
"range1",
{ "$cond" : [ { "$and" : [
{ "$gt":["$Date",start2] },
{ "$lt":["$Date",end2] }
]
},
"range2",
null
]
}
]
}
}
};
group = { "$group" : { "_id" : "$range",
"clicks" : { "$sum" : "$clicks" }
}
};
现在,运行db.collection.aggregate( project, group )
将为您提供两个日期范围内每个日期范围的点击次数总和。 您可以$match
作为中间步骤来删除{range:null}
以删除与两个范围不匹配的文档。
您提到要作为聚合依据的原始文档中有一个"Id"字段,因此您需要做的就是将"Id":1添加到$project
步骤中,然后更改$group
中的分组子句,如下所示:
group = { "$group" : { "_id" : {"Id" : "$Id", "range" : "$range"},
"clicks" : { "$sum" : "$clicks" }
}
};
这将按 Id,range 分组,而不是在整个集合中按日期范围分组,以便对于每个 Id,您将获得范围 1 的总和和范围 2 的总和。
可能是我错过了一些东西,但是以下列方式组合它们有什么问题:
'$match' => array(
'Date' => array('$gte'=>$actualstartdate,'$lte'=>$actualenddate),
// here is your another query
)
如果我错过了重点,请发布您正在执行的两个查询。
如果需要组合两个相同的查询,可以使用$or
$match' => array(
'$or' => array(
'Date' => array('$gte'=>$actualstartdate1,'$lte'=>$actualenddate1),
'Date' => array('$gte'=>$actualstartdate2,'$lte'=>$actualenddate2),
)
)