从查找中返回最后一个文档
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)
当我想在猫鼬中从数据库中查找文档时,函数返回未定义 [重复]