How to apply condition on $lookup result in mongoDB? How to apply condition on $lookup result in mongoDB? mongodb mongodb

How to apply condition on $lookup result in mongoDB?


You can't use "$match" with a object method after "$lookup", because return value of "$lookup" are array values. You better add "$unwind" function after the look up then group it.

Example Query

 db.album.aggregate([    {        $lookup:{            from:"photo",            localField:"_id",            foreignField:"album_id",            as:"photo"        }     },    {        preserveNullAndEmptyArrays : true,        path : "$photo"    },    {        $match:{            "photo.flag": 1        }     },     {        $group : {            _id : {                id : "$_id",                album_name: "$album_name",                album_description: "$album_description",                emoji_id: "$emoji_id"            },            photo: {                $push : "$photo"            }        }     }    {         $lookup:{            from:"emoji",            localField:"_id.album_emoji",            foreignField:"_id",            as:"emoji"         }    },    {         $project:{            album_name:"$album_name",            album_description:"$album_description",            emoji:"$emoji",            photo:"$photo",            total_photos: {$size: "$photo"}         }    }])

Or use "$filter".

db.album.aggregate([    {        $lookup:{            from:"photo",            localField:"_id",            foreignField:"album_id",            as:"photo"        }     },    {        $project: {            id : "$_id",            album_name: "$album_name",            album_description: "$album_description",            emoji_id: "$emoji_id",            photo: {                $filter : {                    input: "$photo",                    as : "photo_field",                    cond : {                        $eq: ["$$photo_field.flag",1]                    }                }            }        }    },    {         $lookup:{            from:"emoji",            localField:"album_emoji",            foreignField:"_id",            as:"emoji"         }    },    {         $project:{            album_name:"$album_name",            album_description:"$album_description",            emoji:"$emoji",            photo:"$photo",            total_photos: {$size: "$photo"}         }    }])


Your query is wrong. What is localField:"album_emoji", there is no field named album_emoji in Album collection. The field name is album_id in Album collection which is a foreign key to _id in Emoji collection.

If you are using version 3.5, the correct query is (I assume Album, Photo, Emoji are the names of three collections):

 db.Album.aggregate([  {   $lookup:{    from:"Photo",    localField:"_id",    foreignField:"album_id",    as:"photo" }},{ $match:{    "photo.flag": 1 }},{ $lookup:{    from:"Emoji",    localField:"emoji_id",    foreignField:"_id",    as:"emoji" }},{  $project:{    album_name:"$album_name",    album_description:"$album_description",    album_emoji:"$emoji.emoji_name",    photo:"$photo",    total_photos: {$size: "$photo"} }}]).pretty()

And the result is as follows:

/* 1 */{ "_id" : 1, "album_name" : "my album 1", "album_description" : "album description 1", "album_emoji" : [    "1.jpg" ], "photo" : [    {        "_id" : 1,        "photo_name" : "1.jpg",        "photo_description" : "description 1",        "album_id" : 1,        "flag" : 1    },    {        "_id" : 2,        "photo_name" : "2.jpg",        "photo_description" : "description 2",        "album_id" : 1,        "flag" : 1    },    {        "_id" : 3,        "photo_name" : "3.jpg",        "photo_description" : "description 3",        "album_id" : 1,        "flag" : 1    } ], "total_photos" : 3}