Как отсортировать массив документов, получить его содержимое и длину в агрегации mongodb? - PullRequest
0 голосов
/ 06 марта 2020

Предположим, у меня есть схема, как показано ниже:

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*/}
    ]
}

1 Ответ

1 голос
/ 06 марта 2020

Вы можете изменить свою группу на сумму 1 каждый раз, когда он находит комментарий. Как то так:

$group: {
    _id: '$_id', 
    'comments': {$sum: 1}
}
...