Получение последнего сообщения между 2 людьми в разговоре Mongo

#mongodb #mongodb-query

#mongodb #mongodb-запрос

Вопрос:

Я пытаюсь найти решение, в котором я могу вернуть список последних чатов между 2 пользователями с их последним сообщением в нем. Я просмотрел несколько статей и увидел, что с помощью aggregate я смогу добиться этого. Однако, попробовав приведенный ниже код, я все равно получаю дополнительный / дублирующий документ. Могу ли я в любом случае отфильтровать это еще больше, чтобы убедиться, что на человека ПРИХОДИТСЯ ТОЛЬКО 1 документ (туда или обратно)

 Chat.aggregate(
  [{ $match: { $or: [{ "sender._id": senderId }, { "reciever._id": senderId }] } },
  { $sort: { time: -1 } },
  {
    $group: {
      "_id": {
        "last_message_between": {
          $cond: [
            {
              $gt: [
                { $substr: ["$reciever._id", 0, 1] },
                { $substr: ["$sender._id", 0, 1] }]
            },
            { $concat: ["$sender._id", " and ", "$reciever._id"] },
            { $concat: ["$reciever._id", " and ", "$sender._id"] }
          ]
        }
      },
      "message": { $first: "$$ROOT" }
    }
  }], function (err, data) {
    if (err || !data) {
      res.status(400).json({
        error: err,
      });
    }
    res.json(data);
  })
  

Вывод Mongo

Комментарии:

1. Вы неправильно пишете «приемник». Я не понимаю, сколько документов вы пытаетесь вернуть, 1 или более 1?

2. Также единственными двумя соответствующими тегами для этого вопроса являются mongodb и mongodb-query.

3. Я пытаюсь вернуть только 1 документ (последний), не имеет значения, кто отправляет сообщение, модель должна отправить обратно только один последний документ. в этом случае — модель должна отправлять только первый элемент, в котором он отправляет 2. Тот, в котором получатель отправил сообщение, а другой наоборот. Извинения за грамматическую ошибку исправят серверную часть 🙂

4. Почему $limit 1 после сортировки не работает?

5. Не работает . Например, скажем, есть 3 чата 1- A -> B 2. A -> C 3. B -> A С ограничением 1 Я получаю только один чат (A -> B).

Ответ №1:

Ваша идея сопоставить два идентификатора с $cond была хорошей.

Но чтобы заставить его работать в каждом случае, вам просто нужно сравнить всю строку, а не только первые символы.

Попробуйте это здесь

 db.collection.aggregate([
  {
    $match: {
      $or: [
        {
          "sender._id": "user_1@gmail.com"
        },
        {
          "receiver._id": "user_1@gmail.com"
        }
      ]
    }
  },
  {
    $sort: {
      time: -1
    }
  },
  {
    $group: {
      "_id": {
        "last_message_between": {
          $cond: [
            {
              $gt: [
                "$receiver._id",
                "$sender._id"
              ]
            },
            {
              $concat: [
                "$sender._id",
                " and ",
                "$receiver._id"
              ]
            },
            {
              $concat: [
                "$receiver._id",
                " and ",
                "$sender._id"
              ]
            }
          ]
        }
      },
      "message": {
        $first: "$$ROOT"
      }
    }
  }
])
  

Комментарии:

1. Вы, сэр, абсолютная легенда. Сработало как шарм. Если в любом случае я мог бы угостить вас кофе, пожалуйста, дайте мне знать 🙂

2. Ахах, большое спасибо, но это не имело большого значения. Хорошего дня 🙂