是否可以组合两个Mongodb查询


Is it possible to combine two Mongodb queries?

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

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

$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),
   )
)