【问题标题】:Return the last Document From a Lookup从查找中返回最后一个文档
【发布时间】:2023-03-12 12:55:01
【问题描述】:
db.groups.aggregate([
   {
     $lookup:
       {
         from: "posts",
         localField: "_id",
         foreignField: "group",
         as: "post"
       }
  }
])

我收到了群组和所有帖子的回复,例如.. [{geoup1,[post's array]}, {group2,[post's array]}]

如果有任何帖子,我只想将最后添加的帖子添加到帖子集合中

【问题讨论】:

    标签: mongodb mongoose mongodb-query aggregation-framework


    【解决方案1】:

    您可以使用$slice

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

    或者使用 MongoDB 3.6,只需使用 $lookup 以非相关形式返回最后一个帖子:

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

    后者更好,因为您只返回您真正想要的外部集合中的文档。

    如果您确定要“单数”,则$arrayElemAt 可以与初始示例中的$slice 互换,但返回最后一个元素而不是仅返回最后一个元素的数组。您还可以将其添加到第二种形式中,以仅从管道中获取一个元素,该元素“始终”是一个数组:

    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 ] }
       }}
    ])
    

    这样就可以使用0 索引,而不是最后的-1

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-02-07
      • 2013-06-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-05-23
      相关资源
      最近更新 更多