Пн goose агрегат не работает с $ или - PullRequest
0 голосов
/ 08 июля 2020

Я работаю над приложением чата. Моя схема выглядит так:

{
  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 }}
...   ]);

1 Ответ

0 голосов
/ 09 июля 2020

Я чувствую себя глупо из-за того, что публиковал это в первую очередь.

Проблема оказалась в том, что значения в from и to имели тип Types.ObjectId, потому что они были получены из другая коллекция.

Значения, хранящиеся в ChatDB, были строками. Из-за этого запрос из консоли mon go работал нормально (потому что я указывал строку правильно), а запрос с mon goose в коде не работал.

Однако я все еще не знаю, почему Запрос 1 сработал.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...