Предположим, у меня есть схема, как показано ниже:
user = {
id:'an id'
username: 'some username'
}
post = {
id:'an id'
creater: 'some user id'
postText: 'some text'
}
comment = {
id:'an id'
idOfPostThisCommentBelongsTo: 'some id'
idOfCommenter: 'some id',
commentText: 'some text'
}
Ниже мой mongodb через mon goose агрегатная функция:
Post.aggregate([
{$match:{"_id" : 'idOfThePost'}},
{$lookup:{from:"users",localField:"creater",foreignField:"_id",as:"userWhoCreatedThisPost"}},
{$unwind:"$userWhoCreatedThisPost"},
{$lookup:{from:"comments",localField:"_id",foreignField:"idOfPostThisCommentBelongsTo",as:"comments"}},
// unwind, sort by date, grouping them back
{$unwind: {
"path": '$comments',
"preserveNullAndEmptyArrays": true
}},
{$sort: {'comments.createdAt': -1}},
{$group: {
_id: '$_id',
postText:{$first: '$postText'},
//how can I get the length of the comments' array????
'comments': {$push: '$comments'}
}},
// without the group pipeline this is how I can get the number of comments(see below)
// but when I try using the group pipeline(above) and project pipeline(below)
// and the aggregation doesn't work
{$project:{
numberOfComments:{$size:'comments'},
}}
Я смог получить комментарии и даже сортировать их по дате. Но я застрял, пытаясь получить длину всех комментариев.
Я знаю, что могу использовать $first
, чтобы получить значения предыдущего документа. Я пробовал комментарии: {$first: {$size: $comments}}
, но это не работает.
Как я могу получить размер массива комментариев, по-прежнему сортируя массив по дате, и в то же время получая значения почтовых и пользовательских документов? (см. ниже, например)
{
_id: 5e5faae00e77ab07f0a7c661,
userWhoPostedThePost: 'object with user details'
postText: 'post text',
comments: [ // sorted by date in descending order
{ /** comment content*/},
{ /** comment content*/}
]
}