实际上我有两个日期范围,一个是实际日期范围,另一个是比较日期范围。对于每个日期范围,我正在执行两个不同的查询。
我选择了聚合方法。我为每个日期范围编写的代码是..
$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'),
))
),
));
我怀疑是否可以编写查询,以便获取diff列中两个日期范围的数据。由于我有太多的记录,所以需要很长时间。
我非常感谢如果有人帮我解决这个问题。提前致谢。
答案 0 :(得分:1)
听起来您想要比较两个不同日期范围的点击次数(或其他一些总和)。把它想象成几天做聚合。您可以使用这些值将日期转换为range1,range2或其他以及组,而不是几天。
这是一个让你开始比较两个日期范围的例子,start1-end1,start2-end2:
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,范围进行分组,以便每个Id获得range1的总和和range2的总和。
答案 1 :(得分:0)
可能是我遗漏了什么,但是以下列方式组合它们有什么问题:
'$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),
)
)