db.groups.aggregate([
{
$lookup:
{
from: "posts",
localField: "_id",
foreignField: "group",
as: "post"
}
}
])
我正在收到群组和所有帖子的回复,例如.. [{geoup1,[post's array]},{group2,[post's array]}]
如果有任何帖子,我只想将最后添加的帖子添加到帖子集合中
答案 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
。