$where
का इस्तेमाल करके शायद सर्च करना सबसे अच्छा है
सामान्य क्वेरी के अलावा, और अभी भी सर्वर पर चीजें रखें:
db.getCollection('collection').find({
"array": {
"$elemMatch": { "field": "BCD", "enabled": "true" },
},
"$where": function() {
return this.array.map((e,i) => Object.assign(e,{ i }))
.filter( e => e.field === "BCD" && e.enabled === "true" )
.map( e => e.i )[0] <=
this.array.map(e => e.enabled).indexOf("true")
}
})
और अगर आपके पास $indexOfArray
के समर्थन के साथ MongoDB 3.4 है। कोड>
और $range
, तो यह लंबा लग सकता है लेकिन यह वास्तव में $redact
:
db.getCollection('collection').aggregate([
{ "$match": {
"array": {
"$elemMatch": { "field": "BCD", "enabled": "true" },
}
}},
{ "$redact": {
"$cond": {
"if": {
"$lte": [
{ "$arrayElemAt": [
{ "$map": {
"input": {
"$filter": {
"input": {
"$map": {
"input": {
"$zip": {
"inputs": [
"$array",
{ "$range": [0, { "$size": "$array" }] }
]
}
},
"as": "a",
"in": {
"field": { "$arrayElemAt": [ "$$a.field", 0 ] },
"enabled": { "$arrayElemAt": [ "$$a.enabled", 0 ] },
"index": { "$arrayElemAt": [ "$$a", 1 ] }
}
}
},
"as": "a",
"cond": {
"$and": [
{ "$eq": [ "$$a.field", "BCD" ] },
{ "$eq": [ "$$a.enabled", "true" ] }
]
}
}
},
"as": "a",
"in": "$$a.index"
}},
0
]},
{ "$indexOfArray": [ "$array.enabled", "true" ] }
]
},
"then": "$$KEEP",
"else": "$$PRUNE"
}
}}
])
तो वास्तव में कोई वास्तविक क्वेरी ऑपरेशन नहीं है जो इसे लागू करता है, लेकिन ये दोनों मामले क्लाइंट को वायर पर डेटा भेजने और फिर फ़िल्टर करने के विपरीत "सर्वर पर" चयन रखते हैं।
क्योंकि यदि आप ऐसा करते हैं तो यह पहली बार में डेटाबेस का उपयोग करने के उद्देश्य को नकार देता है। तो आप वाकई चाहते हैं कि यह सर्वर पर हो।