क्या आप अपने PHP कोड में उसी डेटाबेस नेमस्पेस से कनेक्ट कर रहे हैं जिसे आपने शेल का उपयोग करने से जोड़ा है? मुझे नहीं लगता!
वैसे भी आप $where
की अवधारणा को गलत समझते हैं
इस संदर्भ में, चूंकि आप केवल मूल्यांकन कर सकते हैं और नहीं वापसी संग्रह में पहले से मौजूद डेटा के अलावा संशोधित परिणाम।
केवल वही चीज़ें जो वास्तव में मौजूदा दस्तावेज़ों से कुछ अलग लौटा सकती हैं, वे हैं .mapReduce()
और .aggregate()
।
तो प्रदर्शित करने के लिए, "समान नामस्थान" में यदि आप एक संग्रह को परिभाषित करते हैं:
db.djunk.insert({ "x": 1, "y": 2 })
और फिर एक .mapReduce()
चलाएं
db.dbjunk.mapReduce(
function() {
emit(this._id, sum(this.x,this.y))
},
function() {}, // does nothing here where already unique
{ "out": { "inline": 1 } }
)
वह वापस होगा एक वास्तविक सारांशित परिणाम:
{
"_id" : ObjectId("571a9bb951d042a7a896fd92"),
"value" : 3
}
वह सब $where
कर सकते हैं, "तार्किक रूप से" दस्तावेज़ का चयन करें:
db.djunk.find(function() {
return sum(this.x,this.y) > 3
})
जो शर्त को पूरा नहीं करेगा।
लेकिन निश्चित रूप से आपको वास्तव में ऐसा करने की ज़रूरत नहीं है, और आम तौर पर जहां संभव हो वहां जावास्क्रिप्ट के किसी भी सर्वर निष्पादन से बचना चाहिए। यह देशी ऑपरेटरों की तुलना में बहुत धीमा है, और आप देशी ऑपरेटरों के साथ काफी कुछ कर सकते हैं।
तो इसके बजाय .mapReduce()
कॉल .aggregate()
:
db.djunk.aggregate([
{ "$project": {
"total": { "$add": [ "$x", "$y" ] }
}}
])
और जावास्क्रिप्ट मूल्यांकन के बजाय, .aggregate()
. पर कॉल करें फिर से, $redact
के साथ
"तार्किक" फ़िल्टरिंग के लिए:
db.djunk.aggregate([
{ "$redact": {
"$cond": {
"if": { "$gt": [ { "$add": [ "$x", "$y" ] }, 3 ] },
"then": "$$KEEP",
"else": "$$PRUNE"
}
}}
])
इसलिए ज्यादातर मामलों में जावास्क्रिप्ट मूल्यांकन का उपयोग करने के लिए हमेशा एक बेहतर विकल्प होता है। और निश्चित रूप से ऐसे मामलों में वास्तव में बहुत कम मामलों में सर्वर संग्रहीत कार्यों की आवश्यकता होती है जहां वास्तव में जावास्क्रिप्ट मूल्यांकन की आवश्यकता होती है।
लेकिन यहां आपकी मूल त्रुटि होगी क्योंकि फ़ंक्शन एक अलग नामस्थान में था, या वास्तव में आपने सर्वर को बीच में पुनरारंभ किया था। लेकिन समग्र बिंदु यह है कि आपको शायद वैसे भी संग्रहीत कार्यों का उपयोग नहीं करना चाहिए।