当前位置: 首页 > 知识库问答 >
问题:

如何使用Spring MongoTemplate获取具有where条件和日期范围的集合字段?

曾景龙
2023-03-14

我想将以下控制台mongodb查询转换为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

共有1个答案

穆洋
2023-03-14

您将日期作为字符串传递。尝试以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);
 类似资料:
  • > 每个对象表示一个重复发生的事件。该事件可以在多个日期发生。因此,请考虑以下内容: 我有一个日历在客户端,用户可以选择一个日期范围。 > 对所选日期范围的每个条目进行调用,并在客户端处理聚合。问题是会有大量的读取,因为我们会多次读取重叠的日期范围内的同一个列表对象。 尝试使用类似ElasticSearch/Algolia的服务来完成此操作 任何建议都会很有帮助!

  • 问题内容: 我有一个ID为,状态和员工日期范围的数据集。 下面给出的输入数据集是一名员工的详细信息。 记录中的日期范围是连续的(按确切顺序),因此第二行的开始日期将是第一行的结束日期的下一个日期。 如果员工连续休假不同的月份,则该表将存储日期范围不同的信息。 例如:在输入集中,员工已从‘16 -10-2016’休病假到‘31 -12-2016’,并在‘1-1-2017’重新加入。 因此,该项目有3

  • audit_modifier是VARCHAR2(30个字符),并且audit_modifier值以以下格式存储[2018-01-18T17:19:47.285z]。 从TO_DATE('2018-01-16','yyyy-mm-dd')和TO_DATE('2018-01-16','yyyy-mm-dd')之间的trunc(audit_modifier)的表中选择*; ORA-00932:不一致的数

  • 问题内容: 假设我有个约会2013年6月20日 如何获取上周的日期范围,即本例中的6月9日至6月15日。 另外,如果日期是2013年6月2日 范围应该是5月26日至6月1日 问题答案: 这是基于Java日历的解决方案 输出 它已本地化,在我的“语言环境”周中,从星期一开始

  • 在方括号 […] 中的几个字符或者字符类意味着“搜索给定的字符中的任意一个”。 集合 比如说,[eao] 意味着查找在 3 个字符 'a'、'e' 或者 `‘o’ 中的任意一个。 这被叫做一个集合。集合可以在正则表达式中和其它常规字符一起使用。 // 查找 [t 或者 m],然后再匹配 “op” alert( "Mop top".match(/[tm]op/gi) ); // "Mop", "to

  • 我正在尝试使用Node Lambda函数在日期范围之间进行扫描。我正确扫描了数据,但我似乎无法让日期表达式正确工作。 这目前并没有试图在一个范围内返回,它只是现在查看一个日期。我不想在表达式中添加一个和,直到我知道这是可行的。 我的DynamoDB中的示例文档的结构如下: 文档id是我的主键。我对Lamdba和DynamoDB的组合还很陌生,所以我可能把它完全设置错了,但这是我通过研究成功完成的。