Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

mongodb how to apply pagination and total photo count in aggregate query

Following is my collection architecture.

I don't know how apply pagination and get total photo count in aggregate query. I know that it may possible but I tried a lot, still I didn't solve the issue. Guide me for following issue.

If any optimized solution for this, then please guide me.

Photo:

{_id: 1, photo_name: '1.jpg', photo_description: 'description 1', album_id: 1},
{_id: 2, photo_name: '2.jpg', photo_description: 'description 2', album_id: 1},
{_id: 3, photo_name: '3.jpg', photo_description: 'description 3', album_id: 1},
{_id: 4, photo_name: '4.jpg', photo_description: 'description 4', album_id: 2},
{_id: 5, photo_name: '5.jpg', photo_description: 'description 5', album_id: 2},
{_id: 6, photo_name: '6.jpg', photo_description: 'description 6', album_id: 2}

Album:

{_id: 1, album_name: "my album 1", album_description: "album description 1", emoji_id: 1},
{_id: 2, album_name: "my album 2", album_description: "album description 2", emoji_id: 2},
{_id: 3, album_name: "my album 3", album_description: "album description 3", emoji_id: 3},
{_id: 4, album_name: "my album 4", album_description: "album description 4", emoji_id: 4},
{_id: 5, album_name: "my album 5", album_description: "album description 5", emoji_id: 5}

Emoji:

{_id: 1, emoji_name: "1.jpg"},  
{_id: 2, emoji_name: "2.jpg"},  
{_id: 3, emoji_name: "3.jpg"},  
{_id: 4, emoji_name: "4.jpg"},  
{_id: 5, emoji_name: "5.jpg"},  
{_id: 6, emoji_name: "6.jpg"},  
{_id: 7, emoji_name: "7.jpg"},  
{_id: 8, emoji_name: "8.jpg"}   

Testing record pagination :

2

Expected output:

[
    {
        album_id: 1,
        album_name: "my album 1",
        album_emoji: "1.jpg",
        total_photos: 3,(total photo counts of all photos of paritcular album)
        photos: [
            {
                {_id: 1, photo_name: '1.jpg', photo_description: 'description 1'},
                {_id: 2, photo_name: '2.jpg', photo_description: 'description 2'}
            }
        ]
    }
]

Present query:

db
.album
.aggregate([
  {
     $lookup:{
        from:"photo",
        localField:"_id",
        foreignField:"album_id",
        as:"photo"
     }
  },
  {
     $lookup:{
        from:"emoji",
        localField:"album_emoji",
        foreignField:"_id",
        as:"emoji"
     }
  },
  {
     $project:{
        album_name:"$album_name",
        album_description:"$album_description",
        album_emoji:"$emoji.image_name",
        photo:"$photo"
     }
  },
  {
     $match:{
        _id: 1
     }
  }
])
.toArray();

Present output:

[{
   "_id" : 1,
   "album_name" : "my album 1",
   "album_emoji" : [
      "1.png"
   ],
   "photo" : [
      {_id: 1, photo_name: '1.jpg', photo_description: 'description 1', album_id: 1},
      {_id: 2, photo_name: '2.jpg', photo_description: 'description 2', album_id: 1},
      {_id: 3, photo_name: '3.jpg', photo_description: 'description 3', album_id: 1},
   ]
}]
like image 937
Dipak Avatar asked Oct 19 '22 03:10

Dipak


1 Answers

You may want to check $slice and adjust your $project stage somewhat like this

 ...
 $project:{
    album_name:"$album_name",
    album_description:"$album_description",
    album_emoji:"$emoji.image_name",
    photo: { $slice: [ "$photo", 0, 2 ] }
 }
 ...

Just pass different values to the $slice operator for getting different pages

like image 154
tengobash Avatar answered Nov 02 '22 12:11

tengobash