如何使用 Mongo 存储库两次查询同一字段?

Posted

技术标签:

【中文标题】如何使用 Mongo 存储库两次查询同一字段?【英文标题】:How to query the same field twice using the Mongo Repository? 【发布时间】:2019-06-09 15:56:16 【问题描述】:

所以我想进行一个查询,以查找我的集合中存在的所有任务,条件是在两个给定日期之间有一个日期属性。 我使用了 Between 关键字,但它不包括结果中的参数值。 例如,如果参数是 2019-09-20 和 2019-09-25,则计划在相同日期执行的任务将不会在响应中返回。

我尝试使用 LessThanEqual 和 GreaterThanEqual,但出现以下错误:

org.springframework.data.mongodb.InvalidMongoDbApiUsageException: Due to limitations of the com.mongodb.BasicDocument, you can't add a second 'task.date' expression specified as 'task.date : Document$lte=Thu Sep 26 00:00:00 CEST 2019'. Criteria already contains 'task.date : Document$gte=Wed Sep 25 00:00:00 CEST 2019'.

这就是为什么我想知道是否有办法在同一个字段上查询两次。

这是我的存储库。

public interface TaskRepository extends MongoRepository<TaskEntry, String> 
    List<TaskEntry> findByTask_DateGreaterThanEqualAndTask_DateLessThanEqual(Date dateFrom, Date dateTo);

谢谢。

更新: 这是使用 rustyx 的答案后我的集合、查询和结果的说明性示例。 这些是我的文件:

[
    
        "id": "5c3da5b163c2789768d1402a",
        "code": "0000001",
        "createdDate": "2019-01-15T09:19:45.114+0000",
        "lastModifiedDate": "2019-01-15T09:19:45.114+0000",
        "task": 
            "codeRule": null,
            "title": "Task 1",
            "date": "2019-09-26T00:00:00.000+0000",
            "description": "This is the first task",
            "type": "UNITARY",
            "result": null
        
    ,
    
        "id": "5c3da7dc63c2789768d1402b",
        "code": "0000002",
        "createdDate": "2019-01-15T09:29:00.125+0000",
        "lastModifiedDate": "2019-01-15T09:29:00.125+0000",
        "task": 
            "codeRule": null,
            "title": "Task 2",
            "date": "2019-09-26T00:00:00.000+0000",
            "description": "This is the second task",
            "type": "UNITARY",
            "result": null
        
    ,
    
        "id": "5c3db0c763c27868b41e022b",
        "code": "0000003",
        "createdDate": "2019-01-15T10:07:03.693+0000",
        "lastModifiedDate": "2019-01-15T10:07:03.693+0000",
        "task": 
            "codeRule": null,
            "title": "Task 3",
            "date": "2019-09-28T00:00:00.000+0000",
            "description": "This is the third task",
            "type": "UNITARY",
            "result": null
        
    
]

这是我使用这个得到的响应:

@Query("'task.date': $gte: ?0, $lte:?1 ")
    List<TaskEntry> findByTask_DateBetween(Date dateFrom, Date dateTo);

还有这个:

/tasks?dateFrom=2019-09-26&dateTo=2019-09-28

回应:

[
    
        "id": "5c3da5b163c2789768d1402a",
        "code": "0000001",
        "createdDate": "2019-01-15T09:19:45.114+0000",
        "lastModifiedDate": "2019-01-15T09:19:45.114+0000",
        "task": 
            "codeRule": null,
            "title": "Task 1",
            "date": "2019-09-26T00:00:00.000+0000",
            "description": "This is the first task",
            "type": "UNITARY",
            "result": null
        
    ,
    
        "id": "5c3da7dc63c2789768d1402b",
        "code": "0000002",
        "createdDate": "2019-01-15T09:29:00.125+0000",
        "lastModifiedDate": "2019-01-15T09:29:00.125+0000",
        "task": 
            "codeRule": null,
            "title": "Task 2",
            "date": "2019-09-26T00:00:00.000+0000",
            "description": "This is the second task",
            "type": "UNITARY",
            "result": null
        
    
]

日期为 2019-09-26 的任务被添加到响应中,这意味着 $gte: ?0 正在运行,但日期为 2019-09-28 的任务不在其中。 p>

【问题讨论】:

为什么不从“开始日期”中减去 1 天,然后在“到日期”中添加 1 天,然后运行查询? 我对此深信不疑,它会起作用,但我想找到一种更精确的方法来做到这一点,因为我也必须在以后工作几个小时,而不仅仅是约会。 好的。您是否尝试过将时间戳附加到日期,以便“从日期”有 00:00:00 而“到日期”有 23:59:59? 我添加了我拥有的文档示例和日期字段的值。由于我还没有使用小时,我将所有日期设置为 00:00:00。我想我会在 23:59:59 附加 dateTo 参数,如果其他建议的答案不能解决它。谢谢。 【参考方案1】:

你可以使用“Between”:

    List<TaskEntry> findByTask_DateBetween(Date dateFrom, Date dateTo);

如果这还不够,请使用自定义查询:

    @Query("'date': $gte: ?0, $lte:?1 ")
    List<TaskEntry> findByTask_DateBetween(Date dateFrom, Date dateTo);

【讨论】:

谢谢,这正是我需要的。但它工作了一半,所以我会更新问题以供反馈。 问一个新问题可能会更好。现在我的答案被打破了! 我完全忘记了时区问题。我将不得不在另一个层面上进行管理。但是您的回答 @Query("'date': $gte: ?0, $lte:?1 ") 正在工作,我正在使用它。谢谢。

以上是关于如何使用 Mongo 存储库两次查询同一字段?的主要内容,如果未能解决你的问题,请参考以下文章

Spring Mongo 条件查询两次相同的字段

java如何实现mongodb中查询指定字段?

mongodb查询,如何只查询出某一个字段的值?

用于预订的 MySQL 查询。如何允许在同一日期进行两次预订(入住/退房)

如何查询将日期存储为某种格式的字符串的 mongo 集合?

如何使用 MongoRepository 接口更新 mongo db 中的特定字段?