Как $ искать / заполнять внедренный документ, который находится внутри массива?
Ниже показано, как выглядит моя схема.
const CommentSchema = new mongoose.Schema({
commentText:{
type:String,
required: true
},
arrayOfReplies: [{
replyText:{
type:String,
required: true
},
replier: [{
type: mongoose.Schema.Types.ObjectId,
ref: 'User',
required: true,
}],
}],
});
Как получить результаты запроса, которые выглядят как показано ниже:
[
{
commentText: 'comment text',
arrayOfReplies: [
{
replyText: 'replyText',
replier: {
username:"username"
bio: 'bio'
}
}
]
}
]
Я пытаюсь заполнить поле replier
внутри массива arrayOfReplies
. Я пробовал несколько вариантов запроса агрегации ниже. Те, кто приблизился к тому, чего я пытаюсь достичь, имеют один недостаток. Комментарии, которые не имеют ответов, имеют массив arrayOfReplies
с пустым объектом. Т.е. arrayOfReplies: [{}]
, что означает, что массив не пуст.
Я пытался использовать add fields , $ mergeObjects среди других операторов конвейера, но безрезультатно.
Как $ искать / заполнять документ replier
, который находится внутри массива arrayOfReplies
?
Ниже приведен шаблон основной части моего запроса агрегации, за исключением попытки заполнить replier
документ.
Comment.aggregate([
{$unwind: {"path": '$arrayOfReplies', "preserveNullAndEmptyArrays": true }},
{$lookup:{from:"users",localField:"$arrayOfReplies.replier",foreignField:"_id",as:"replier"}},
{$unwind: {"path": "$replier", "preserveNullAndEmptyArrays": true }},
{$group: {
_id : '$_id',
commentText:{$first: '$commentText'},
userWhoPostedThisComment:{$first: '$userWhoPostedThisComment'},
arrayOfReplies: {$push: '$arrayOfReplies' },
}},