यहां मुख्य बात है एग्रीगेशन $slice
सरणी से अंतिम तत्व प्राप्त करने के लिए,
db.chat.aggregate([
{ "$match": { "user1": 1, "messages.capty": "B" } },
{ "$redact": {
"$cond": {
"if": {
"$eq": [ { "$slice": [ "$messages.capty", -1 ] }, ["B"] ]
},
"then": "$$KEEP",
"else": "$$PRUNE"
}
}},
{ "$project": {
"user2": 1,
"body": {
"$arrayElemAt": [
{ "$map": {
"input": {
"$filter": {
"input": { "$slice": [ "$messages",-1 ] },
"as": "m",
"cond": { "$eq": [ "$$m.capty", "B" ] }
}
},
"as": "m",
"in": "$$m.body"
}},
0
]
}
}}
])
मैं वास्तव में $project
चरण के साथ $filter
लेकिन यह सब मूल रूप से एक ही है।
पहले क्वेरी दस्तावेज़ों का चयन करती है, हम वास्तव में इस बिंदु पर "केवल" सरणी के अंतिम तत्व से मेल खाने के लिए नहीं कह सकते हैं, लेकिन हम उन दस्तावेज़ों को फ़िल्टर करना चाहते हैं जिनकी सरणी पर बिल्कुल भी शर्त नहीं है।
$redact
वास्तविक चीज़ है जो "अंतिम" सरणी प्रविष्टि को देखती है और फ़ील्ड के मान का परीक्षण करती है। हम सरणी से केवल फ़ील्ड को $messages.capty
. द्वारा नोट कर सकते हैं जो उन वस्तुओं की सिर्फ एक सरणी देता है। यहां हम $slice
या यहां तक कि $arrayElemAt
यदि आप -1
. की अनुक्रमणिका होने के नाते अंतिम मान प्राप्त करना चाहते हैं ।
इस बिंदु पर हम केवल "दस्तावेजों" को "फ़िल्टर" करते हैं जो शर्त से मेल नहीं खाते। अंतिम $project
चरण सरणी के अंतिम तत्व को लेता है, जांचता है कि यह उस स्थिति से मेल खाता है (जो इसे पहले के चरणों में होना चाहिए), "body"
का मान निकालता है और एकल सरणी सामग्री को केवल सादा मान में बदल देता है।
आप वैकल्पिक रूप से "सावधानी" को छोड़ सकते हैं और $redact
के बाद से बस अंतिम सरणी तत्व को पकड़ सकते हैं अपना काम करना चाहिए था:
db.chat.aggregate([
{ "$match": { "user1": 1, "messages.capty": "B" } },
{ "$redact": {
"$cond": {
"if": {
"$eq": [ { "$arrayElemAt": [ "$messages.capty", -1 ] }, "B" ]
},
"then": "$$KEEP",
"else": "$$PRUNE"
}
}},
{ "$project": {
"user2": 1,
"body": {
"$arrayElemAt": [ "$messages.body", -1 ]
}
}}
])
पूरी बात वास्तव में "संभव से मेल खाने के लिए टूट जाती है एक क्वेरी के साथ दस्तावेज़" और फिर "अंतिम तत्व की तुलना करें और निकालें $slice
या $arrayElemAt
".
परिणाम हैं:
{
"_id" : ObjectId("593921425ccc8150f35e7663"),
"user2" : 3,
"body" : "hiii 23"
}
{
"_id" : ObjectId("593921425ccc8150f35e7664"),
"user2" : 4,
"body" : "hiii 24"
}