2016-11-16 2 views
0

Я хочу перевести следующую консоль MongoDB запрос в Spring mongoTemplate запросКак получить поля коллекции с условием и диапазоном дат с помощью Spring mongoTemplate?

db.transaction.find({"account_number":10}, {"entry_date":{"$gte": new ISODate("2016-07-20"),"$lte": new ISODate("2016-07-21")}}).count() 

Я попытался следующие

Query query = new Query(); 
     Criteria criteria = 
       Criteria.where("account_number").is(accountNumber).and("account_code").is(accountCode) 
       .and("entry_date").gte(start).lte(end); 
     query.addCriteria(criteria); 
     mongoTemplate.find(query, Transaction.class, "transaction"); 
     return mongoTemplate.find(query, Transaction.class, "transaction"); 

при отладке, я получил выше код переводится в следующее значение запроса. Запрос не возвращает те же результаты, которые я получил на консоли mongo.

Query: { "account_number" : 10 , "account_code" : 2102 , "entry_date" : { "$gte" : "2015-05-20" , "$lte" : "2016-07-21"}} 

Вопрос в том, как я могу построить запрос для передачи двух разных условий с помощью find, как я сделал на консоли?

То, что я пытаюсь достичь, - это получить все транзакции между двумя датами (включительно) для данного номера учетной записи.

Коллекция Структура

{ 
    "_id" : ObjectId("5825e49585a4caf2bfa30ff4"), 
    "profit" : "", 
    "account_number" : 280, 
    "m_number" : "", 
    "registration_number" : "", 
    "page_number" : "", 
    "entry_date" : ISODate("2014-10-20T07:33:57Z"), 
    "narration" : "To cash", 
    "voucher_number" : "", 
    "debit_credit" : -4400, 
    "account_code" : 2105, 
    "created_at" : ISODate("2014-10-20T07:33:57Z"), 
    "updated_at" : ISODate("2014-10-20T07:33:57Z"), 
    "employee_id" : 0, 
    "balance" : 0, 
    "credit" : 0, 
    "debit" : 0, 
    "particulars" : "", 
    "since_last" : 0, 
    "transaction_type" : 0, 
    "voucher_path" : "", 
    "branch" : "", 
    "auto_voucher_number" : "", 
    "check_book_series" : "" 
} 
{ 
    "_id" : ObjectId("5825e49585a4caf2bfa30ff5"), 
    "profit" : "", 
    "account_number" : 1555, 
    "m_number" : "", 
    "registration_number" : "", 
    "page_number" : "", 
    "entry_date" : ISODate("2014-10-20T07:33:57Z"), 
    "narration" : "To", 
    "voucher_number" : 73804, 
    "debit_credit" : -1550, 
    "account_code" : 2101, 
    "created_at" : ISODate("2014-10-20T07:33:57Z"), 
    "updated_at" : ISODate("2014-10-20T07:33:57Z"), 
    "employee_id" : 0, 
    "balance" : 0, 
    "credit" : 0, 
    "debit" : 0, 
    "particulars" : "", 
    "since_last" : 0, 
    "transaction_type" : 0, 
    "voucher_path" : "", 
    "branch" : "", 
    "auto_voucher_number" : "", 
    "check_book_series" : "" 
} 

Решение Исходный запрос возвращает только записи для ACCOUNT_NUMBER = 10 и игнорирует entry_date состояние. Я предполагаю, что это неправильный способ запроса. Вот правильное решение

DateTime start, DateTime end; 

     Query query = new Query(); 
     Criteria criteria = 
       Criteria.where("account_number").is(accountNumber).and("account_code").is(accountCode) 
       .and("entry_date").gte(start).lte(end); 
     query.addCriteria(criteria); 

     return mongoTemplate.find(query, Transaction.class, "transaction"); 

важно, что даты в правильном формате. Например, java.util.Date или JODA DateTime

ответ

0

Вы передаете даты как String. Попробуйте передать дату начала и окончания даты как типы java.util.Date. Например

LocalDate startLocalDate = LocalDate.of(2014, 10, 19); 
Date startDate = Date.from(startLocalDate.atStartOfDay().toInstant(ZoneOffset.UTC)); 

Criteria criteria = Criteria.where("entry_date").gte(startDate); 
+0

спасибо Veeram - ваш комментарий частично помог мне. – amjad

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