是否可以组合两个Mongodb查询?

时间:2013-11-05 12:14:57

标签: php mongodb aggregation-framework

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

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

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

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

2 个答案:

答案 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),
   )
)