从查找中返回最后一个文档

时间:2018-05-22 11:17:06

标签: mongodb mongoose mongodb-query aggregation-framework

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

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

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

1 个答案:

答案 0 :(得分: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互换,但仅返回最后一个元素而不是最后一个元素的数组。您也可以将它添加到第二个表单中,只需从管道中获取一个元素,即#34;始终"一个数组:

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