Я работаю над приложением чата. Моя схема выглядит так:
{
from: String,
to: String,
message: String,
attachment: {
name: String,
size: Number,
type: String,
},
unread: Boolean,
sent: Date,
seen: Date,
}
Следующий код работает и возвращает последние сообщения:
Запрос 1:
ChatDB.aggregate([
{ $match: {
$or: [
{ from, to },
{ from: to, to: from },
],
}},
{ $sort: { sent: -1 }},
{ $limit: messageBatchSize },
{ $sort: { sent: 1 }},
]);
Но , когда я пытаюсь разбить на страницы, включив в запрос метку времени, он больше не работает:
Запрос 2:
ChatDB.aggregate([
{ $match: {
sent: { $lt: new Date(beforeTimestamp) },
$or: [
{ from, to },
{ from: to, to: from },
],
}},
{ $sort: { sent: -1 }},
{ $limit: messageBatchSize },
{ $sort: { sent: 1 }},
]);
Если я удалю $or
часть и сохранить только проверку отметки времени на sent
, все работает, но (конечно) он возвращает результаты для всех пользователей, что не то, что я хочу:
Запрос 3:
ChatDB.aggregate([
{ $match: {
sent: { $lt: new Date(beforeTimestamp) },
}},
{ $sort: { sent: -1 }},
{ $limit: messageBatchSize },
{ $sort: { sent: 1 }},
]);
Сначала я подумал, что нужно что-то делать, чтобы не преобразовывать идентификаторы из строки в ObjectId, и изменил свой код на использование Types.ObjectId
соответственно. Но даже это не помогло. Я имею в виду, Запрос 1 работает правильно без преобразования.
Есть идеи, что происходит? Моя mongoose
версия:
"mongoose": "^5.8.2",
Изменить:
Я попытался запустить запрос в консоли mon go, и он вернул результаты правильно:
> db.chats.aggregate([
... {
... $match: {
... $or: [
... { from: '5f0319f87278d056876952d5', to: 'org' },
... { to: '5f0319f87278d056876952d5', from: 'org' },
... ],
... sent: { $lt: new Date('2020-07-08T17:05:34.288Z') }
... }
... },
... { $sort: { sent: -1 }},
... { $limit: 20 },
... { $sort: { sent: 1 }}
... ]);