代码之家  ›  专栏  ›  技术社区  ›  Smit Patel

从查找返回最后一个文档

  •  0
  • Smit Patel  · 技术社区  · 7 年前
    db.groups.aggregate([
       {
         $lookup:
           {
             from: "posts",
             localField: "_id",
             foreignField: "group",
             as: "post"
           }
      }
    ])
    

    我正在得到团体和所有类似的帖子的回复。[geoup1,[post's array],group2,[post's array]]

    如果有任何帖子,我只想最后一个添加到帖子收藏中的帖子

    1 回复  |  直到 7 年前
        1
  •  2
  •   Neil Lunn    7 年前

    你也可以用 $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 可与互换 切片 但只返回最后一个元素而不是最后一个元素的数组。您还可以将它添加到第二个表单中,以便只从管道中获取一个元素,即“始终”数组:

    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 最后。