Это моя модель сообщения
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
]