0

实际上我有两个日期范围,一个是实际日期范围,另一个是比较日期范围。对于每个日期范围,我正在执行两个不同的查询。

我选择了聚合方法。我为每个日期范围编写的代码是..

$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 列中两个日期范围的数据。因为我有太多的记录,所以需要很长时间。

如果有人帮助我解决这个问题,我将非常感激。提前致谢。

4

2 回答 2

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”字段,因此您只需在$project步骤中添加“Id”:1,然后更改分组子句$group如下:

group = { "$group" : { "_id" : {"Id" : "$Id", "range" : "$range"},
                       "clicks" : { "$sum" : "$clicks" }
        }
};

这不是按整个集合中的日期范围分组,而是按 Id,range 分组,这样对于每个 Id,您都会得到 range1 的总和和 range2 的总和。

于 2013-11-06T04:18:28.630 回答
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),
   )
)
于 2013-11-05T12:30:35.377 回答