Bagaimana cara mengurutkan array dokumen, mendapatkan isinya dan panjangnya dalam agregasi mongodb?

Asumsikan saya memiliki skema seperti yang ditunjukkan di bawah ini:

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' 
}

Di bawah ini adalah mongodb saya melalui fungsi agregat luwak:

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'},
        }}

Saya bisa mendapatkan komentar dan bahkan mengurutkannya berdasarkan tanggal. Tapi saya terjebak mencoba untuk mendapatkan panjang semua komentar.

Saya sadar saya dapat menggunakan $first untuk mendapatkan nilai dari dokumen sebelumnya. Saya sudah mencoba komentar: {$first: {$size: $comments}} tetapi tidak berhasil.

Bagaimana saya bisa mendapatkan ukuran array komentar, sambil tetap mengurutkan array berdasarkan tanggal, sambil tetap mendapatkan nilai postingan dan dokumen pengguna? (lihat di bawah misalnya)

{
    _id: 5e5faae00e77ab07f0a7c661,
    userWhoPostedThePost: 'object with user details'
    postText: 'post text',
    comments: [ // sorted by date in descending order
              { /** comment content*/},
              { /** comment content*/}
    ]
}

person YulePale    schedule 06.03.2020    source sumber


Jawaban (1)


Pada dasarnya Anda dapat mengubah grup Anda menjadi jumlah 1 setiap kali dia menemukan komentar. Sesuatu seperti ini:

$group: {
    _id: '$_id', 
    'comments': {$sum: 1}
}
person Guiller    schedule 06.03.2020