आप या तो $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
. के बजाय अनुक्रमणिका आखिरी के लिए।