Perform joins in mongodb with three collections? Perform joins in mongodb with three collections? mongoose mongoose

Perform joins in mongodb with three collections?


Okay, looks like you've bunch of problems. I'll try to sum them up.

Problem 1 : the aggregate code you've provided doesnt compile.

db.user_movies.aggregate({$match : {mobile_no : mobile_no}},{$unwind: "$movies" },{$lookup: {from: "movies",localField: "movies",foreignField: "movie_id",as: "bmarks"}},{$unwind : "$bmarks"},{$match : {"bmarks.active": 1}},{$group : { _id : "$_id", movies : {$push : "$bmarks"}, movie_ids: {$push : "$bmarks.movie_id"}}},{$lookup: {from: "movie_comments", localField: "",foreignField: "movie_id",as: "comments"}},{$unwind : "$comments"},{$sort: {time_posted: -1}},{$group: {_id: '$_id', comments : {$push : "$comments"}}},

Fix:

db.user_movies.aggregate([{$match : {mobile_no : mobile_no}},{$unwind: "$movies" },{$lookup: {from: "movies",localField: "movies",foreignField: "movie_id",as: "bmarks"}},{$unwind : "$bmarks"},{$match : {"bmarks.active": 1}},{$group : { _id : "$_id", movies : {$push : "$bmarks"}, movie_ids: {$push : "$bmarks.movie_id"}}},{$lookup: {from: "movie_comments", localField: "",foreignField: "movie_id",as: "comments"}},{$unwind : "$comments"},{$sort: {time_posted: -1}},{$group: {_id: '$_id', comments : {$push : "$comments"}}}])

Now assume you're using the same data you have provided.

Problem 2 : {$match : {"bmarks.active": 1}} doesnt match any entry.

Fix : {$match : {"bmarks.active": 0}}

Problem 3 : No look up field defined {$lookup: {from: "movie_comments", localField: "",foreignField: "movie_id",as: "comments"}}

Fix : {$lookup: {from: "movie_comments", localField: "movie_ids",foreignField: "movie_id",as: "comments"}}

Problem 4 : No unwind stage for movie_ids for previous look up

Fix : {$unwind : "$movie_ids"}

Problem 5 : No time posted field {$sort: {time_posted: -1}}

Fix : include field before sorting

So, to put everything together you need aggregate to look like something below for extracting the comments for each movie.

db.user_movies.aggregate([{$match : {mobile_no : mobile_no}},{$unwind: "$movies"},{$lookup: {from: "movies",localField: "movies",foreignField: "movie_id",as: "bmarks"}},{$unwind : "$bmarks"},{$match : {"bmarks.active": 0}},{$group : { _id : "$_id", movies : {$push : "$bmarks"}, movie_ids: {$push : "$bmarks.movie_id"}}},{$unwind : "$movie_ids"},{$lookup: {from: "movie_comments", localField: "movie_ids",foreignField: "movie_id",as: "comments"}},{$unwind : "$comments"},{$group: {_id: '$_id', comments : {$push : "$comments"}}}])

Sample Output

{    "_id": ObjectId("5834ecf7432d92675bde9d83"),    "comments": [{        "_id": ObjectId("583d96d7e35f6e9c53c9e894"),        "movie_id": "dallas00",        "comment": "what a great movie."    }, {        "_id": ObjectId("583d96d7e35f6e9c53c9e895"),        "movie_id": "dallas00",        "comment": "awesome movie."    }]}

Update:

db.user_movies.aggregate([{$match : {mobile_no : mobile_no}},{$unwind: {path: "$movies", includeArrayIndex: "moviePosition"}},{$sort :  {moviePosition:1}},{$lookup: {from: "movies",localField: "movies",foreignField: "movie_id",as: "bmarks"}},{$unwind :"$bmarks"},{$group : {_id : "$_id", movies : {$push : {movie_name:"$bmarks.movie_name", movie_id:"$bmarks.movie_id"} }}},{$unwind : "$movies"},{$lookup: {from: "movie_comments", localField: "movies.movie_id",foreignField: "movie_id",as: "comments"}},{$unwind : "$comments"},{$group:  {_id: "$movies.movie_id", movie_name: {$first:"$movies.movie_name"}, comments : {$push : {comment:"$comments.comment", time_posted:"$comments.time_posted"}}}},{$sort :  {time_posted:-1}},{$project:{_id:0, movie_id:"$_id", movie_name:1, comments: "$comments.comment"}}]).pretty();