Return the last Document From a Lookup

后端 未结 1 1943
鱼传尺愫
鱼传尺愫 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)
提交回复
热议问题