Получить список последних последних сообщений между отправителем и получателем из коллекции сообщений Mongoose - PullRequest
0 голосов
/ 06 апреля 2020

Это моя модель сообщения

const mongoose = require("mongoose");

const { Schema } = mongoose;

const messageSchema = new Schema({
  message: {
  type: String
  },
 sender: {
 type: Schema.Types.ObjectId,
 ref: "users"
 },
 senderEmail: {
 type: String
},
receiverEmail: {
type: String
},
receiver: {
type: Schema.Types.ObjectId,
ref: "users"
},
createdAt: {
type: Date,
default: Date.now
}
});

const Message = mongoose.model("messages", messageSchema);

module.exports = Message;

И это мой контроллер

Message.aggregate([
          {
            $match: {
              $or: [
                { senderEmail: req.user.email },
                { receiverEmail: req.user.email },
              ],
            },
          },
          {
            $project: {
              sender: 1,
              receiver: 1,
              senderEmail: 1,
              message: 1,
              receiverEmail: 1,
              createdAt: 1,
            },
          },
          { $sort: { createdAt: -1 } },
          {
            $group: {
              _id: { $concat: ["$senderEmail", "$receiverEmail"] },
              senderEmail: { $last: "$senderEmail" },
              receiverEmail: { $last: "$receiverEmail" },
              message: { $last: "$message" },
              createdAt: { $last: "$createdAt" },
            },
          },
          //   {
          //     $match: {
          //       $or: [
          //         { sender: mongoose.Types.ObjectId(req.user.id) },
          //         { receiver: mongoose.Types.ObjectId(req.user.id) },
          //       ],
          //     },
          //   },
          //   {
          //     $sort: { createdAt: -1 },
          //   },
          //   {
          //     $group: {
          //       _id: {
          //         last_message_between: {
          //           $cond: [
          //             {
          //               $gt: [
          //                 {
          //                   $substr: ["$senderEmail", 0, 1],
          //                 },
          //                 {
          //                   $substr: ["$receiverEmail", 0, 1],
          //                 },
          //               ],
          //             },
          //             {
          //               $concat: ["$senderEmail", " and ", "$receiverEmail"],
          //             },
          //             {
          //               $concat: ["$receiverEmail", " and ", "$senderEmail"],
          //             },
          //           ],
          //         },
          //       },
          //       body: { $last: "$$ROOT" },
          //     },
          //   },
        ])

Оба моих запроса: первый и второй в комментариях не отвечают моим требованиям , Они возвращают результат последнего разговора как последнее сообщение отправителя (X) и получателя (y) и последнее сообщение отправителя (y) отправителя (X). Я не хочу, нужно два Только последний.

[
 {
 id: "x@gmail.com.y@gmail.com.com"
 senderEmail: "x@gmail.com"
 receiverEmail: "y@gmail.com"
 message: "hey"
 createdAt: "2020-03-26T17:05:21.747Z"
 },
 {
  _id: "y@gmail.com.x@gmail.com"
  senderEmail: "y@gmail.com"
  receiverEmail: "x@gmail.com"
  message: "hi"
  createdAt: "2020-03-26T16:46:24.433Z"
 }
 ...and so on with other receiver 
]

Я хочу, чтобы запрос возвратил список последних последних сообщений между определенным отправителем и получателем, например, список последних сообщений на боковой панели сообщения

[
 {
 id: "x@gmail.com.y@gmail.com.com"
 senderEmail: "x@gmail.com"
 receiverEmail: "y@gmail.com"
 message: "hey"
 createdAt: "2020-03-26T17:05:21.747Z"
 }
  Or this but the latest one
 {
  _id: "y@gmail.com.x@gmail.com"
  senderEmail: "y@gmail.com"
  receiverEmail: "x@gmail.com"
  message: "hi"
  createdAt: "2020-03-26T16:46:24.433Z"
 }
 ...and so on with other receiver 
]
...