मान लें कि हमारे संग्रह में निम्नलिखित दस्तावेज़ हैं:
{ "_id" : ObjectId("5759658e654456bf4a014d01"), "a" : [ 1, 3, 9, 2, 9, 0 ] }
{ "_id" : ObjectId("5759658e654456bf4a014d02"), "a" : [ 0, 8, 1 ] }
{ "_id" : ObjectId("5759658e654456bf4a014d03"), "a" : [ 0, 8, 432, 9, 34, -3 ] }
{ "_id" : ObjectId("5759658e654456bf4a014d04"), "a" : [ 0, 0, 4, 3, 2, 7 ] }
और निम्नलिखित इनपुट सरणी और n = 2
var inputArray = [1, 3, 0];
हम उन दस्तावेज़ों को वापस कर सकते हैं जहां सरणी फ़ील्ड में एकत्रीकरण ढांचे का उपयोग करके किसी दिए गए सरणी के कम से कम n तत्व होते हैं।
$match
केवल उन दस्तावेज़ों का चयन करता है जिनकी सरणी की लंबाई अधिक या बराबर होती है n
. यह पाइपलाइन में संसाधित किए जाने वाले डेटा की मात्रा को कम करता है।
$redact
पाइपलाइन ऑपरेटर $cond
. का उपयोग करके तार्किक स्थिति प्रसंस्करण का उपयोग करता है ऑपरेटर और विशेष ऑपरेशन $$KEEP
दस्तावेज़ को "रखने" के लिए जहाँ तार्किक स्थिति सही है या $$PRUNE
दस्तावेज़ को "त्याग" करने के लिए जहां शर्त गलत है।
हमारे मामले में, शर्त $gte
. है जो सच हो जाता है अगर $size
दो सरणियों के प्रतिच्छेदन की, जिसकी गणना हम $setIntersection
. का उपयोग करके करते हैं ऑपरेटर 2
. से बड़ा या बराबर है .
db.collection.aggregate(
[
{ "$match": { "a.1": { "$exists": true } } },
{ "$redact": {
"$cond": [
{ "$gte": [
{ "$size": { "$setIntersection": [ "$a", inputArray ] } },
2
]},
"$$KEEP",
"$$PRUNE"
]
}}
]
)
जो उत्पादन करता है:
{ "_id" : ObjectId("5759658e654456bf4a014d01"), "a" : [ 1, 3, 9, 2, 9, 0 ] }
{ "_id" : ObjectId("5759658e654456bf4a014d02"), "a" : [ 0, 8, 1 ] }
{ "_id" : ObjectId("5759658e654456bf4a014d04"), "a" : [ 0, 0, 4, 3, 2, 7 ] }