2014-12-19 10 views
10

पर मोंगोडीबी एकत्रीकरण प्रोजेक्ट स्ट्रिंग मैं एक हेक्साडेसिमल स्ट्रिंग को समेकन क्वेरी में इसके समकक्ष ऑब्जेक्ट आईडी में परिवर्तित करने का प्रयास कर रहा हूं। या तो विधि का उपयोग करऑब्जेक्ट आईडी

db.omvas.aggregate([ 
    {$project:{ 
     EID:{$let: { 
       vars: { 
        id: "$EID" 
       }, 
       in: ObjectId("$$id") 
      }}, 
     } 
    }, 
    {$group:{ 
     _id:"$EID" 
     } 
    } 
]); 

और

db.omvas.aggregate([ 
    {$project:{ 
     EID: ObjectId("$EID") 
     } 
    }, 
    {$group:{ 
     _id:"$EID" 
     } 
    } 
]); 

मैं त्रुटि मिलती रहती है "लंबाई त्रुटि::: अमान्य ऑब्जेक्ट आईडी" मैं दो अलग अलग तरीकों की कोशिश की। मैंने समेकन चर के स्थान पर एक शाब्दिक स्ट्रिंग जोड़ने का परीक्षण किया और मुझे उचित ऑब्जेक्ट आईडी के साथ परिणाम मिला। ऐसा लगता है कि स्ट्रिंग मान को मोंगो के ऑब्जेक्टआईडी फ़ंक्शन के माध्यम से पारित नहीं किया जा रहा है, बल्कि परिवर्तनीय नाम को शाब्दिक स्ट्रिंग के रूप में पारित किया जा रहा है।

किसी को भी कोई विचार है यदि मैं पूरा करने की कोशिश कर रहा हूं तो संभव है? क्या कोई जादू है जो मुझे याद आ रही है?

उत्तर

3

ObjectId शैल में ऑब्जेक्ट आईडी के लिए एक निर्माता है। जब आप की तरह

"EID" : { "$let" : { 
      "vars" : { "id" : "$EID" }, 
      "in" : ObjectId("$$id") 
     } } 

कुछ लिखो मोंगो खोल एकत्रीकरण अनुरोध भेजने से पहले ObjectId("$$id") मूल्यांकन करता है। यह सिर्फ अगर तुम

var x = 2 
var y = 4 
f(x + y) // f(6) 

तरह जावास्क्रिप्ट में एक समारोह में कहा जाता क्या आप की जरूरत एक एकत्रीकरण ऑपरेटर एक ObjectId में एक स्ट्रिंग परिवर्तित करने के लिए है। दुर्भाग्य से, मोंगोडीबी 2.6 के रूप में ऐसा कोई कार्य मौजूद नहीं है। आपको स्ट्रिंग को कन्वर्ट करने की आवश्यकता क्यों है? आप इससे क्या करने वाले हैं? शायद एकत्रीकरण में एक रूपांतरण ऑपरेटर की कमी के आसपास एक रास्ता है।

+0

धन्यवाद, यह सही समझ में आता है। यह विशेष क्वेरी एक रिपोर्टिंग वर्कफ़्लो में केवल एक चरण है। ऑब्जेक्टआईडी आवश्यक था क्योंकि इसे पाइपलाइन से आगे प्रश्नों द्वारा उपयोग किया जा रहा है। मैं पुनर्विचार कर रहा हूं कि वे अब कैसे काम करते हैं और सोचते हैं कि मेरे पास उन्हें निष्पादित करने का एक बेहतर तरीका है। – StevenWarren

+1

मेरे मामले में मैं एक '$ लुकअप' करना चाहता हूं जहां स्थानीय क्षेत्र 'ऑब्जेक्ट आईडी' का एक स्ट्रिंग प्रतिनिधित्व है और विदेशी क्षेत्र वास्तविक 'ऑब्जेक्ट आईडी' है। कोई विचार अगर यह संभव है w/MongoDB 3.2? – Madbreaks

+1

इसके आस-पास एक तरीका एक स्क्रिप्ट लिखना होगा जो संग्रह में दस्तावेज़ों के लिए ऑब्जेक्ट आईडी के रूप में आईडी वाला एक नया फ़ील्ड जोड़ता है। फिर नए क्षेत्र का उपयोग कर $ लुकअप करें। –

संबंधित मुद्दे