Я хочу использовать $ lookup для объединения 3 разных коллекций в mongoDB и заполнить массив ref соответствующими данными ссылки, которая является коллекцией клиента.
Conversation:
{
_id: mongoose.Schema.Types.ObjectId,
participants: [{ type: mongoose.Schema.Types.ObjectId, ref: "client" }],
created_at: { type: Date, default: Date.now },
}
Сообщение:
{
_id: mongoose.Schema.Types.ObjectId,
conversation_id: { type: mongoose.Schema.Types.ObjectId, ref: "Conversation",
message: { type: String, default: "" },
sender: {type: mongoose.Schema.Types.ObjectId,ref: "Client",default: null},
reciever: {type: mongoose.Schema.Types.ObjectId,ref: "Client",default: null,},
created_at: { type: Date, default: Date.now }
}
Клиент:
{
_id: mongoose.Schema.Types.ObjectId,
email: {type: String, required: true, unique: true},
name: { type: String, default: "" },
job: { type: String, default: "" },
company: { type: String, default: "" },
school: { type: String, default: "" },
}
Вот что я сейчас использую без заполнить:
Conversation.aggregate([
{ $match: { participants: { $all: [mongoose.Types.ObjectId(myId)] } } },
{
$lookup: {
from: "messages",
localField: "_id",
foreignField: "conversation_id",
as: "messages",
},
},
{
$unwind: { path: "$messages", preserveNullAndEmptyArrays: true },
},
{ $sort: { "messages.created_at": -1 } },
{
$group: {
_id: "$_id",
messages: { $first: "$messages" },
doc: { $first: "$$ROOT" },
},
},
{ $replaceRoot: { newRoot: "$doc" } },
])
Это результат, который я получаю:
[
{
"_id": "5f29ca6fc410a01e6fd53ca1",
"participants": [
"5f1c4685546a7741b8c6e801",
"5f1c80d1f52da506603278f1"
],
"messages": {
"_id": "5f2aff3715db59002458f650",
"message": "Thanks man",
"sender": "5f1c80d1f52da506603278f1",
"reciever": "5f1c4685546a7741b8c6e801",
"conversation_id": "5f29ca6fc410a01e6fd53ca1",
"created_at": "2020-08-05T18:49:27.752Z",
"__v": 0
}
},
{
"_id": "5f29c944c410a01e6fd4aa2b",
"participants": [
"5f1c4685546a7741b8c6e801",
"5f05d5e20db0174bd4b55b29"
]
}
]
Я хочу заполнить массив участников, когда я объединяю диалог с сообщением .
Спасибо.