2012-07-24 16 views
113

मैं एक Node.js अनुप्रयोग है कि कुछ डेटा खींचती है और एक वस्तु में चिपक जाता है, इस तरह है:नेवला _ id और तार की तुलना

var results = new Object(); 

User.findOne(query, function(err, u) { 
    results.userId = u._id; 
} 

जब मैं एक करते हैं/फिर उस संग्रहीत आईडी के आधार पर, तुलना कभी नहीं सच है:

if (results.userId == AnotherMongoDocument._id) { 
    console.log('This is never true'); 
} 

जब मैं दो पहचान-पत्र की एक console.log करते हैं, वे ठीक प्रकार से दिखाई:

User id: 4fc67871349bb7bf6a000002 AnotherMongoDocument id: 4fc67871349bb7bf6a000002 

मैं के रूप में कर रहा हूँ यह कुछ प्रकार की डेटाटाइप समस्या है, लेकिन मुझे यकीन नहीं है कि results.userId को डेटाटाइप में कैसे परिवर्तित किया जाए, जिसके परिणामस्वरूप उपरोक्त तुलना सच हो जाएगी और मेरा आउटसोर्स मस्तिष्क (उर्फ Google) मदद करने में असमर्थ रहा है।

उत्तर

204

नेवला MongoDB देशी चालक है, जो कस्टम ObjectID प्रकार का उपयोग करता उपयोग करता है। आप ऑब्जेक्ट आईडी की तुलना .equals() विधि से कर सकते हैं। आपके उदाहरण के साथ, results.userId.equals(AnotherMongoDocument._id)। ऑब्जेक्ट आईडी में toString() विधि भी है, यदि आप जेएसओएन प्रारूप में ऑब्जेक्ट आईडी का एक स्ट्रिंग संस्करण स्टोर करना चाहते हैं, या कुकी।

यदि आप ObjectID = require("mongodb").ObjectID (मोंगोड-मूल पुस्तकालय की आवश्यकता है) का उपयोग करते हैं तो आप जांच सकते हैं कि results.userIdresults.userId instanceof ObjectID के साथ एक मान्य पहचानकर्ता है या नहीं।

आदि

+7

'.equals()' के लिए डॉक्स: http://mongodb.github.io/node-mongodb-native/api-bson-generated/objectid.html#equals –

+1

यदि आप पहले से ही 'मोंगोज़' का उपयोग कर रहे हैं केवल '(' mongoose ') की आवश्यकता हो सकती है। mongo.ObjectID' इसलिए आपको किसी भी अतिरिक्त निर्भरता – JoshuaDavid

48

ObjectID एस ऑब्जेक्ट्स हैं इसलिए यदि आप उनकी तुलना == से करते हैं तो आप उनके संदर्भों की तुलना कर रहे हैं। आप उनके मूल्यों की तुलना करना चाहते हैं तो आप ObjectID.equals विधि का उपयोग करने की जरूरत है:

if (results.userId.equals(AnotherMongoDocument._id)) { 
    ... 
} 
3

स्वीकार्य उत्तर वास्तव में आपके कोड के साथ क्या कर सकते हैं सीमित कर सकते हैं। उदाहरण के लिए, आप बराबर विधि का उपयोग करके Object Ids की सरणी खोज नहीं पाएंगे। इसके बजाए, यह हमेशा स्ट्रिंग करने और चाबियों की तुलना करने के लिए अधिक समझ में आता है।

यदि किसी विशिष्ट आईडी के संदर्भों की सरणी में चेक करने के लिए आपको indexOf() का उपयोग करने की आवश्यकता है तो यहां एक उदाहरण जवाब दिया गया है। मान query एक प्रश्न आप को क्रियान्वित कर रहे हैं, मान लें someModel आईडी आप देख रहे हैं के लिए एक मोंगो मॉडल है, और अंत में results.idList मान क्षेत्र आप में अपने ऑब्जेक्ट id के लिए देख रहे है।

query.exec(function(err,results){ 
    var array = results.idList.map(function(v){ return v.toString(); }); 
    var exists = array.indexOf(someModel._id.toString()) >= 0; 
    console.log(exists); 
}); 
+1

या एक-लाइनर सूचीबद्ध करने की आवश्यकता नहीं है:' मौजूद मौजूद = results.idList.filter (val => val.toString() === यह IStTheStringifiedIdWeAreLookingFor)। लम्बाई? सच: झूठा' – Zlatko

+2

@Zlatko मैं नए वाक्यविन्यास का एक बड़ा प्रशंसक नहीं हूं बल्कि प्रत्येक के लिए। – r3wt

+0

@Zlatko 'स्थिरांक मौजूद = results.idList.some (वैल => val.toString() === thisIsTheStringifiedIdWeAreLookingFor)' या 'स्थिरांक मौजूद = results.idList.some (वैल => val.equals (someModel._id)) ' – Pysul

4

करने के लिए वस्तु आईडी परिवर्तित स्ट्रिंग (toString() विधि का उपयोग कर) काम करेगा।

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