我正在运行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,我认为它在第一个查询中使用,但不是第二个,这导致它超时。
我可以进行哪种优化来防止查询超时?
答案 0 :(得分:1)
请改用$exists
条件。 (10gen C#驱动程序中的Exists()
)
在MongoDB中,$where
对于大型集合来说会很慢。从本质上讲,它不使用索引。它只是反序列化每个对象并评估您的子句。
出于完整性的目的,如果您的日期范围包含相对较少的文档,您可以通过切换$and
子句中组件的顺序来充分优化这一点。这样,您将对日期范围内的记录执行慢速操作,而不是对所有记录执行慢速操作。