Тайм-аут MongoDB, когда запрос включает! == - PullRequest
0 голосов
/ 28 марта 2012

Я запускаю 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 Ответ

1 голос
/ 28 марта 2012

Вместо этого используйте условное выражение $exists. (Exists() в драйвере 10gen C #)

В MongoDB $where будет медленным с большими коллекциями. По своей природе он не использует индекс. Он просто десериализует каждый объект и оценивает ваше предложение.

В целях полноты, если ваш диапазон дат содержит относительно мало документов, вы можете оптимизировать это достаточно хорошо, изменив порядок компонентов в предложении $and. Таким образом, вы будете выполнять медленную операцию с записями в диапазоне дат вместо медленной операции с всеми записями.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...