2013-08-22 4 views
0

Я новичок в C# MongoDB-драйвере и задаюсь вопросом о фильтрации объектов в диапазоне дат.C# MongoDB фильтр в диапазоне дат

Моя коллекция имеет множество записей, отформатированных следующий

{ 
    "_id" : ObjectId("51fa6ab684cc97132cfa4616"), 
    "startDate" : ISODate("2013-07-16T00:00:00Z"), 
    "endDate" : ISODate("2013-07-26T00:00:00Z"), 
    "company" : "ABC" 
    "amount" : 15 
} 

Я хочу написать запрос для фильтрации коллекции на основе: («ENDDATE» - «STARTDATE») < 10, что означает, что объект результата должен иметь дату окончания менее 10 дней с даты начала.

Я попытался использовать класс MongoDB.Driver.Builders.Query, но не повезло. Является ли это архивируемым с MongoDB.Driver.Builders.Query.Where()? Поскольку я хочу объединиться с другими вопросами, такими как:

var amountQuery = Query.GT("amount", 10).LT(20); 
var dateRangeQuery = // Query.XXX().... 
var query = Query.And(amountQuery, dateRangeQuery); 
var result = collection.Find(query); 

Или есть ли другой подход?

ответ

0

Без использования оператора $where (docs) вы не можете выполнять операции над данными, такие как сравнение значения двух полей при использовании традиционного вызова find. Если вы должны использовать $where, MongoDb не может использовать индексы для полей в операции $where. Кроме того, для выполнения кода необходимо использовать механизм JavaScript, что также влияет на производительность.

Предполагая, что вы используете MongoDB 2.4 или выше:

var dateRangeQuery=Query.Where(
      new BsonJavaScript("this.endDate - this.startDate < 10")) 

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

Этот запрос можно построить с использованием структуры агрегации, но часто это не является правильным решением для общих запросов и в настоящее время не предназначено для обработки возвращаемых больших наборов результатов и документов (отсюда и название). Например, Here - пример, который использует $subtract.

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