mongodb apply sort to lookup results

You can solve this in a single aggregation step with the new $lookup syntax

db.getCollection('users').aggregate([{
    '$lookup': {
      'from': 'posts',
      'let': {
        'userId': '$_id'
      },
      'pipeline': [{
          '$match': { '$expr': { '$eq': ['$userId', '$$userId'] } }
        }, {
          '$sort': {  'createdAt': -1 }
        }, {
          '$limit': 10
        },
      ],
      'as': 'posts'
    }
  }
])

Note: untested code, but the principle should be clear.


I solved the duplicates using $group and $first

db.getCollection('user').aggregate([
    {$lookup: {from: "post", localField: "_id", foreignField: "userId", as: "post"}},
    {$unwind: { path: "$post", preserveNullAndEmptyArrays: true }},
    {$sort: {"post.createdAt": -1}},
    {$group: {"_id": "$_id", "name": {$first: "$name"}, "post": {$first: "$post"}},
    {$project: {"_id": 1, "name": 1, "post": 1}}
])

Feel free to post your answer


here is a way you can use

db.getCollection('post').aggregate([
{ $limit: 10 },

{$sort: {"createdAt": -1}},

{$lookup: {from: "user", localField: "userId", foreignField: "_id", as: "user"}},
])

you should query post which sorted by date and join with user. so if you want to provide a limit for posts then you can.

Tags:

Mongodb