如何使用 Spring mongoTemplate 获取具有一个 where 条件和日期范围的集合字段?
How to get collection fields with one where condition and a date range using Spring mongoTemplate?
我想将以下控制台 mongodb 查询翻译成 Spring mongo模板查询
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 传递两个不同的条件?
我想要实现的是获取给定 account_number 的两个日期(含)之间的所有交易。
集合结构
{
"_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");
it is important that the dates are in correct format. E.g java.util.Date or JODA DateTime
您将日期作为字符串传递。尝试将开始日期和结束日期都作为 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);
我想将以下控制台 mongodb 查询翻译成 Spring mongo模板查询
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 传递两个不同的条件?
我想要实现的是获取给定 account_number 的两个日期(含)之间的所有交易。
集合结构
{
"_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");
it is important that the dates are in correct format. E.g java.util.Date or JODA DateTime
您将日期作为字符串传递。尝试将开始日期和结束日期都作为 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);