2012-03-28 1 views
0

Я запускаю mapreduce для создания отчета о деятельности информационного бюллетеня.Тайм-аут MongoDB, когда запрос включается! ==

Чтобы запустить отчет для конкретного бюллетеня я использую:

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 условное. (Exists() в драйвере 10gen C#)

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

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

+0

реализовал оба предложения, и он отлично работает. Спасибо! –

Смежные вопросы