Как запросить последние 5 записей в пн goose на основе последних идентификаторов ссылочных свойств - PullRequest
0 голосов
/ 26 марта 2020

У меня есть следующие данные, хранящиеся в mongodb. Я хочу выполнить сложный запрос. Я хочу получить последние 5 сообщений из последних 10 сообщений.

Как я могу это сделать?

[ { _id: 5e7bb4c699aa010ca9bfeed4,
payload: 'Message 1 from A to B',
sender: 'A',
reciever: 'B',
conversationId: 5e7ba776c55fc40b216b0d12,
time: 2020-03-25T19:45:10.029Z,
__v: 0 },

{ _id: 5e7bb52a99aa010ca9bfeed5,
payload: 'Message 1 from B to A',
sender: 'B',
reciever: 'A',
conversationId: 5e7ba776c55fc40b216b0d12,
time: 2020-03-25T19:46:50.171Z,
__v: 0 },

{ _id: 5e7bb57f99aa010ca9bfeed6,
payload: 'Message 2 from A to B'
sender: 'A',
reciever: 'B',
conversationId: 5e7ba776c55fc40b216b0d12,
time: 2020-03-25T19:48:15.965Z,
__v: 0 },

{ _id: 5e7bde6e86caad11b4a7a2a0,
payload: 'This is messages from B to A',
sender: 'B',
reciever: 'A',
conversationId: 5e7ba776c55fc40b216b0d12,
time: 2020-03-25T22:42:54.017Z,
__v: 0 },

{ _id: 5e7bb68f99aa010ca9bfeeda,
payload: 'Message 1 from B to C',
sender: 'B',
reciever: 'C',
conversationId: 5e7bb66d99aa010ca9bfeed9,
time: 2020-03-25T19:52:47.243Z,
__v: 0 },

{ _id: 5e7bb6d599aa010ca9bfeedb,
payload: 'Message 1 from C to B',
sender: 'C',
reciever: 'B',
conversationId: 5e7bb66d99aa010ca9bfeed9,
time: 2020-03-25T19:53:57.805Z,
__v: 0 },

Я пробовал следующий запрос, но он не работает

const qmessages = await messages
  .find({
    conversationId: {
      $in: mapedId,
    },
  })
  .or([
    {
      sender: req.user.fullname,
    },
    {
      reciever: req.user.fullname,
    },
  ])
  .sort({
    conversationId: 1,
    time: 1,
  });

, где mapedId is the an array of conversationsID. если я добавлю .limit к моему запросу, он не будет работать, как ожидалось

Ответы [ 2 ]

1 голос
/ 26 марта 2020

Сначала нужно сопоставить свои разговоры, используя оператор $ in, затем отсортировать по времени, затем группировать по документам разговор, нажимая на root документы, и использовать агрегацию $ slice для ограничения сообщений.

db.collection.aggregate([
  {
    $match: {
      conversationId: {
        $in: [
          "5e7ba776c55fc40b216b0d12",
          "5e7bb66d99aa010ca9bfeed9"
        ]
      }
    }
  },
  {
    $sort: {
      time: -1
    }
  },
  {
    $group: {
      _id: "$conversationId",
      messages: {
        $push: "$$ROOT"
      }
    }
  },
  {
    $project: {
      messages: {
        $slice: [
          "$messages",
          5
        ]
      }
    }
  }
])

Детская площадка

0 голосов
/ 26 марта 2020

Насколько я понимаю, вы хотите последние 5 сообщений каждого conversationId. Rigtht?

Если да, то это будет ответ. Я надеюсь, что это поможет вам получить требуемый ответ.

const qmessages = await messages.aggregate([
  {
    $match: {
      conversationId: "5e7ba776c55fc40b216b0d12"
    }
  },
  {
    $limit: 2 //You can specify number of records to be returned here
  },
  {
    $sort: {
      time: -1
    }
  }
])

Вы также можете посетить эту страницу, где вы увидите рабочий пример. https://mongoplayground.net/p/9YM0I_UJVc2

...