तुलना मोंगोज़ _id और तार


197

मेरे पास एक नोड.जेएस एप्लिकेशन है जो कुछ डेटा को खींचता है और इसे किसी ऑब्जेक्ट में चिपका देता है, जैसे:

var results = new Object();

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

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

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

जब मैं दो आईडी का कंसोल करता हूं, तो वे बिल्कुल मेल खाते हैं:

User id: 4fc67871349bb7bf6a000002 AnotherMongoDocument id: 4fc67871349bb7bf6a000002

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

जवाबों:


360

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

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

आदि।


13

4
यदि आप पहले से ही इसका उपयोग mongooseकर रहे हैं, require('mongoose').mongo.ObjectIDतो आपको किसी भी अतिरिक्त निर्भरता को सूचीबद्ध करने की आवश्यकता नहीं है
जोशूवादिविद

63

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

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

17

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


8

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

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

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
या वन-लाइनर:let exists = results.idList.filter(val => val.toString() === thisIsTheStringifiedIdWeAreLookingFor).length ? true : false
ज़्लातको

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

2
@Zlatko const exists = results.idList.some(val => val.toString() === thisIsTheStringifiedIdWeAreLookingFor) या const exists = results.idList.some(val => val.equals(someModel._id))
axanpi

1
@Zlatko इन सभी वर्षों के बाद, और लगता है क्या। मैं अब आपके संस्करण को पसंद करता हूं। मन अगर मैं इसे उचित उत्तर के साथ मेरे जवाब में जोड़ दूं?
r3wt

1
प्रगति की कीमत :) बेशक आप उत्तर का उपयोग कर सकते हैं, यह उद्देश्य था कि यदि संभव हो तो एक विकल्प या सहायता प्रदान करें।
ज़्लातको

6

उपरोक्त के अनुसार, मैंने समस्या को हल करने के तीन तरीके पाए।

  1. AnotherMongoDocument._id.toString()
  2. JSON.stringify(AnotherMongoDocument._id)
  3. results.userId.equals(AnotherMongoDocument._id)

0

मुझे ठीक उसी समस्या का सामना करना पड़ा और मैंने बस समस्या का समाधान इस प्रकार JSON.stringify()किया: -

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

0

यहां सुझाए गए तीन संभावित समाधानों में अलग-अलग उपयोग के मामले हैं।

  1. इस तरह से दो mongoDocuments पर ObjectID की तुलना करते समय .equals का उपयोग करें

    results.userId.equals (AnotherMongoDocument._id)

  2. एक mongoDocument के एक ऑब्जेक्ट के ObjectID के एक स्ट्रिंग प्रतिनिधित्व की तुलना करते समय .toString () का उपयोग करें। इस तरह

    results.userId === अदरमॉन्गकॉन्डमेंट ।_id.toString ()


तीसरा संभावित समाधान क्या है?
क्रिस कैटिगनी
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.