2012-06-16 7 views
26

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

नेवला का उपयोग करना, मैं निम्नलिखित है: "इन:

DocumentSchema = new Schema 
    title:  String 

Offrefs = new Schema 
    ref:  { type: ObjectId } 
    isa:  String 

BinderSchema = new Schema 
    title:  String 
    contains: [Offrefs] 

Offrefs यह क्या दर्शाता है क्योंकि क्योंकि मैं अन्य बाइंडरों में कुछ बाइंडरों को रोकने के लिए, तार्किक संकलन तैयार करने के लिए सक्षम होना चाहते हैं निर्दिष्ट नहीं करता प्रिंटर के लिए हैं, "" ये एपब के लिए हैं, "" ये केवल वेब हैं, "आदि। (मैंने सभी विविध सामानों को बाहर कर दिया है।)

दुर्भाग्य से, मैंने प्रश्नों में भाग लिया है, जहां से पुनर्प्राप्त किया गया है ऑब्जेक्ट्स

(story._id == offref.ref) -> True 

और दोनों वास्तव में वही दिखते हैं। लेकिन:

(binder._id == offref.ref) -> False 
(String(binder._id) == String(offref.ref)) -> True 

और पिछले दो में दो संदर्भों का एक दृश्य तुलना, वे एक ही आईडी नंबर रहे हैं, लेकिन ObjectId वस्तुओं को सही ढंग से तुलना नहीं है।

मैं लगातार स्ट्रिंग रूपांतरण करना नहीं चाहता, जो एक मजबूत संभावना है जब मैं इन जटिल वस्तुओं को डेटा के पेड़ों में परिवर्तित कर रहा हूं। वृक्ष संबंध किसी भी डीबी में एक भालू हैं; मोंगो डीबी में उन्हें मुश्किल नहीं होना चाहिए।

आप MongoDB में ऑब्जेक्टआईडी तुलना कैसे करते हैं?

उत्तर

76

एक सीधी == (या ===) तुलना संदर्भ के अनुसार दो वस्तुओं की तुलना करेगी, मूल्य नहीं। तो यह केवल तभी सत्य होगा जब वे दोनों एक ही उदाहरण का संदर्भ लें।

इसके बजाय, आप उनके मूल्यों की तुलना करने के ObjectID की equals विधि का उपयोग किया जाना चाहिए:

story._id.equals(offref.ref) 

टिप्पणी में @bendytree नोटों के रूप में, यदि या तो मान शून्य हो सकता है (और आप nulls के रूप में बराबर की तुलना करना चाहते), तो आप के बजाय निम्न का उपयोग कर सकते हैं:

String(story._id) === String(offref.ref) 
+8

हाँ, अनियंत्रित विशेषताएं। – peterjwest

+0

तो यह mongoose.Schema.Types.ObjectID जैसा नहीं है? उनके दस्तावेज़ का तात्पर्य है कि इसमें केवल 'ऑटो' विधि है: http://mongoosejs.com/docs/api.html#schema-objectid-js – peterjwest

+1

@ पीटरजवेस्ट राइट, 'mongoose.Schema.Types.ObjectId' वास्तव में है स्कीमा परिभाषाओं में फ़ील्ड-प्रकार मेटा-डेटा के रूप में उपयोग के लिए। – JohnnyHK

1

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

var compare1 = invitationOwningUser.toString() === linkedOwningUser.toString(); 
var compare2 = invitationOwningUser.equals(linkedOwningUser); 
var compare3 = String(invitationOwningUser) === String(linkedOwningUser); 
logger.debug("compare1: " + compare1 + "; " + "compare2: " + compare2 + "; " + "compare3: " + compare3); 

आउटपुट:

compare1: true; compare2: false; compare3: true 

यह उस समय हुआ जब invitationOwningUser (एक ObjectID) एक संग्रह से आया एक नेवला स्कीमा उपयोग करके बनाया जाता है और linkedOwningUser (यह भी एक ObjectID) का उपयोग नहीं कर बनाई गई एक संग्रह से आया Mongoose (बस नियमित MongoDB विधियों)।

यहाँ (owningUser क्षेत्र) invitationOwningUser युक्त दस्तावेज है:

{ 
    "_id" : ObjectId("05fb8257c95d538d58be7a89"), 
    "linked" : [ 
     { 
      "owningUser" : ObjectId("5781a5685a06e69b158763ea"), 
      "capabilities" : [ 
       "Read", 
       "Update" 
      ] 
     } 
    ] 
} 

तो, मेरे लिए एक लब्बोलुआब यह है के रूप में:

{ 
    "_id" : ObjectId("5782faec1f3b568d58d09518"), 
    "owningUser" : ObjectId("5781a5685a06e69b158763ea"), 
    "capabilities" : [ 
     "Read", 
     "Update" 
    ], 
    "redeemed" : true, 
    "expiry" : ISODate("2016-07-12T01:45:18.017Z"), 
    "__v" : 0 
} 

यहाँ (owningUser क्षेत्र) linkedOwningUser युक्त दस्तावेज है , मैं ऑब्जेक्ट आईडी की तुलना करने के लिए स्ट्रिंग तुलना तकनीक का उपयोग करूँगा, न कि .equals विधि।

+0

यह एक महत्वपूर्ण मुद्दा की तरह लगता है। क्या आप जानते हैं कि मोंगोस उन्हें समान क्यों नहीं देखता है? मैं अनुमान लगा रहा हूं कि 'अगर (! Buffer.isBuffer (अन्य)) 'MongooseBuffer.mixin.equals' में है जो सामग्री को स्कैन करने के लिए एक अनुकूलन प्रतीत होता है। मैं अब चिंतित हूँ! मैंने बस अपना .toString से .equals में परिवर्तित किया। (लेकिन मैं केवल mongoose == mongoose का उपयोग कर रहा हूं, इसलिए मुझे लगता है कि यह जोखिम नहीं है)। – scipilot

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

  • कोई संबंधित समस्या नहीं^_^