Return the last Document From a Lookup

后端 未结 1 1942
鱼传尺愫
鱼传尺愫 2021-01-07 12:00
db.groups.aggregate([
   {
     $lookup:
       {
         from: \"posts\",
         localField: \"_id\",
         foreignField: \"group\",
         as: \"post\"
            


        
1条回答
  •  小鲜肉
    小鲜肉 (楼主)
    2021-01-07 12:21

    You can either use $slice

    db.groups.aggregate([
       { "$lookup": {
         "from": "posts",
         "localField": "_id",
         "foreignField": "group",
         "as": "post"
       }},
       { "$addFields": {
         "post": { "$slice": ["$post", -1] }
       }}
    ])
    

    Or with MongoDB 3.6, just return the last post using $lookup in it's non-correlated form:

    db.groups.aggregate([
       { "$lookup": {
         "from": "posts",
         "as": "post",
         "let": { "id": "$_id" },
         "pipeline": [
           { "$match": { 
              "$expr": { "$eq": [ "$$id", "$group" ] }
           }},
           { "$sort": { "_id": -1 } },
           { "$limit": 1 }
         ]
       }}
    ])
    

    The latter is better because you only return the document from the foreign collection that you actually want.

    If you are certain you want "singular" then $arrayElemAt is interchangeable with $slice in the initial example but returns the last element instead of the array of the last element only. You can also add it to the second form to just take one element from the pipeline, which is "always" an array:

    db.groups.aggregate([
       { "$lookup": {
         "from": "posts",
         "as": "post",
         "let": { "id": "$_id" },
         "pipeline": [
           { "$match": { 
              "$expr": { "$eq": [ "$$id", "$group" ] }
           }},
           { "$sort": { "_id": -1 } },
           { "$limit": 1 }
         ]
       }},
       { "$addFields": {
         "post": { "$arrayElemAt": [ "$post", 0 ] }
       }}
    ])
    

    And that way around it's the 0 index rather than -1 for last.

    0 讨论(0)
提交回复
热议问题