查询包含!==时MongoDB超时

时间:2012-03-28 18:43:47

标签: c# mongodb mapreduce

我正在运行mapreduce来生成有关简报活动的报告。

要运行我使用的特定简报的报告:

var query = Query.And(
                    Query.EQ("NewsletterId", BsonInt32.Create(newsletterId)),
                    Query.GTE("DateAdded", BsonDateTime.Create(startDate)).LTE(BsonDateTime.Create(endDate))
                );

我现在希望能够在所有简报上获得电子邮件活动的汇总报告(使用相同的mapreduce,但只是更改查询)。为此,我使用:

var query = Query.And(
                    Query.Where(new BsonJavaScript("this.NewsletterId !== null")),
                    Query.GTE("DateAdded", BsonDateTime.Create(startDate)).LTE(BsonDateTime.Create(endDate))
                        );

我有一个索引集,其中包括NewsletterId和DateAdded,我认为它在第一个查询中使用,但不是第二个,这导致它超时。

我可以进行哪种优化来防止查询超时?

1 个答案:

答案 0 :(得分:1)

请改用$exists条件。 (10gen C#驱动程序中的Exists()

在MongoDB中,$where对于大型集合来说会很慢。从本质上讲,它不使用索引。它只是反序列化每个对象并评估您的子句。

出于完整性的目的,如果您的日期范围包含相对较少的文档,您可以通过切换$and子句中组件的顺序来充分优化这一点。这样,您将对日期范围内的记录执行慢速操作,而不是对所有记录执行慢速操作。