मानक क्वेरीज़ दस्तावेज़ों में मानों की "तुलना" नहीं कर सकतीं। यह वास्तव में ऐसा कुछ है जो आप .aggregate()
. का उपयोग करके करते हैं और $redact
:
db.collection.aggregate([
{ "$redact": {
"$cond": {
"if": {
"$gt": [
{ "$size": {
"$filter": {
"input": "$offers",
"as": "o",
"cond": { "$eq": [ "$$o.amount", "$amount" ] }
}
}},
0
]
},
"then": "$$KEEP",
"else": "$$PRUNE"
}
}}
])
यहां हम $filter
का इस्तेमाल करते हैं
"amount"
. के मानों की तुलना करने के लिए मूल दस्तावेज़ में सरणी के भीतर उन लोगों के लिए। अगर कम से कम एक "बराबर" है तो हम "$$KEEP"
दस्तावेज़, अन्यथा हम "$$PRUNE"
हाल के संस्करणों में, हम $indexOfArray
।
db.collection.aggregate([
{ "$redact": {
"$cond": {
"if": {
"$ne": [
{ "$indexOfArray": [ "$offers.amount", "$amount" ] },
-1
]
},
"then": "$$KEEP",
"else": "$$PRUNE"
}
}}
])
यदि आप वास्तव में केवल "मिलान करने वाले सरणी तत्व" भी चाहते थे, तो आप एक $filter
प्रक्षेपण में:
db.collection.aggregate([
{ "$redact": {
"$cond": {
"if": {
"$gt": [
{ "$size": {
"$filter": {
"input": "$offers",
"as": "o",
"cond": { "$eq": [ "$$o.amount", "$amount" ] }
}
}},
0
]
},
"then": "$$KEEP",
"else": "$$PRUNE"
}
}},
{ "$project": {
"amount": 1,
"offers": {
"$filter": {
"input": "$offers",
"as": "o",
"cond": { "$eq": [ "$$o.amount", "$amount" ] }
}
}
}}
])
लेकिन मुख्य सिद्धांत निश्चित रूप से केवल . पर लौटाए गए दस्तावेज़ों की संख्या को "कम" करना है वे जो वास्तव में "पहली" प्राथमिकता के रूप में स्थिति से मेल खाते हैं। अन्यथा आप केवल अनावश्यक गणना और काम कर रहे हैं जिसमें समय और संसाधन लग रहे हैं, जिसके परिणाम आप बाद में छोड़ देंगे।
इसलिए पहले "फ़िल्टर" करें, और प्राथमिकता के रूप में दूसरा "रिशेप" करें।