$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
と互換性があります 最初の例では、最後の要素のみの配列ではなく、最後の要素を返します。これを2番目のフォームに追加して、パイプラインから1つの要素(「常に」配列)を取得することもできます。
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
ではなくインデックス 最後に。