Как запросить одно и то же поле дважды, используя репозиторий Mongo? - PullRequest
0 голосов
/ 15 января 2019

Итак, я хочу сделать запрос, который ищет все задачи, существующие в моей коллекции, с критерием наличия атрибута даты между двумя указанными датами. Я использовал ключевое слово 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 отсутствует.

1 Ответ

0 голосов
/ 15 января 2019

Вы можете использовать «Между»:

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

Если этого недостаточно, используйте пользовательский запрос:

    @Query("{'date': {$gte: ?0, $lte:?1 }}")
    List<TaskEntry> findByTask_DateBetween(Date dateFrom, Date dateTo);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...