Запрос диапазона дат в совокупном запросе ничего не возвращает или игнорирует даты - PullRequest
1 голос
/ 02 июля 2019

В своем агрегированном запросе я пытаюсь добавить условия в операторе $ match, чтобы возвращать только записи в указанном диапазоне дат. Без преобразования в ISOString я получаю набор записей, который полностью игнорирует диапазон дат. Когда я конвертирую в ISOString, я ничего не получаю (возвращает пустой набор). Я пытался использовать оператор $ и, но ничего не получилось.

Я перепробовал все решения в стеке, но безрезультатно. Вот мой код:

$match: { 
            $and: [
                {'author.id': { $ne: req.user._id }},
                {'blurtDate': { $gte: test1.toISOString() }},
                {'blurtDate': { $lte: test2.toISOString() }}
            ]
        }

test1 и test2 верны, я проверил их в журнале консоли, они отражают следующее:

2019-06-02T12:44:39.000Z -- 2019-07-02T12:44:39.928Z

Я тоже пытался без оператора $ и так:

$match: { 
            'author.id': { $ne: req.user._id },
            'blurtDate': { $gte: test1.toISOString() },
            'blurtDate': { $lte: test2.toISOString() } 
        }

Что опять ничего не возвращает. Любая помощь высоко ценится!

EDIT: хотел бы подчеркнуть, что test1 и test2 являются новыми объектами даты:

test1 = new Date(qryDateFrom);  //Tried .toISOString() as well
test2 = new Date(qryDateTo);

Без .toISOString () я получаю возврат значений, которые игнорируют даты. С .toISOString я получаю пустой возврат.

Вот пример документа, который должен быть возвращен:

{
    "_id" : ObjectId("5d0a807345c85d00ac4b7217"),
    "text" : "<p>Seriously RV style.</p>",
    "blurtDate" : ISODate("2019-06-19T18:35:31.156Z"),
    "blurtImg" : "04643410-92c1-11e9-80b6-a3262311afff.png",
    "vote" : 0,
    "author" : {
        "id" : ObjectId("5cb5df0ef7a3570bb4ac6e05"),
        "name" : "Benjamin Paine"
    },
    "__v" : 0
}

Когда я удаляю .toISOString (), я получаю документы за пределами ожидаемого диапазона дат, такого как этот в мае (запрос должен возвращаться только между 2 июня и 2 июля).

{
    "_id" : ObjectId("5d07ebaf9a035117e4546349"),
    "text" : "<p>A start to something more...</p>",
    "blurtDate" : ISODate("2019-05-15T19:36:15.737Z"),
    "blurtImg" : "2be7a160-9137-11e9-933f-6966b2e503c7.png",
    "vote" : 0,
    "author" : {
        "id" : ObjectId("5cb5df0ef7a3570bb4ac6e05"),
        "name" : "Benjamin Paine"
    },
    "__v" : 0
}

1 Ответ

1 голос
/ 02 июля 2019

Ваши документы содержат фактические Date объекты, поэтому удалите .toISOString() s из вашего запроса.Но вам также нужно объединить ваши термины $gte и $lte в один объект:

$match: { 
    'author.id': { $ne: req.user._id },
    'blurtDate': { $gte: test1, $lte: test2 }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...