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

Posted

技术标签:

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

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

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

【问题讨论】:

【参考方案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

【讨论】:

以上是关于从查找中返回最后一个文档的主要内容,如果未能解决你的问题,请参考以下文章

从数组中查找并返回第一个匹配的子文档(Meteor / Mongo)

具有多个查找和管道的聚合仅返回最后一个元素

当我想在猫鼬中从数据库中查找文档时,函数返回未定义 [重复]

MongoDB Async - 查找或创建文档;返回它们的数组

empty对如下8种情况返回true

查找并返回非重复值