2014-12-12 11 views
11

मैं Node.js, एक्सप्रेस और MongoDB नेवला का उपयोग कर के साथ एक CRUD शैली बाकी सेवा के निर्माण कर रहा हूँ। यह सेवा ऑनलाइन अपने व्यक्तिगत डेटाबेस की सामग्री को अपलोड/सिंक करने के लिए पहले से मौजूद एंड्रॉइड एप्लिकेशन के उपयोगकर्ताओं को ऑनलाइन अनुमति देने जा रही है।का उपयोग UUIDs का संदर्भ

पहले से मौजूद अनुप्रयोग के लिए डेटा मॉडल यूयूआईडी (जावा में जेनरेट) का उपयोग करता है जो छोटे, मोनोटोनिक मोंगोडीबी शैली _id फ़ील्ड के साथ संघर्ष करता है। चूंकि डेटा मॉडल पहले से मौजूद है और कई उपयोगकर्ताओं के डेटा के साथ पॉप्युलेट किया गया है, इसलिए मैं स्रोत डेटा को मोनोटोनिक मोंगोडीबी-शैली _id एस में परिवर्तित नहीं कर सकता। यह मैं हूँ 2 विकल्प है कि मैं के बारे में सोच सकते हैं के साथ छोड़ दिया है: या तो 1) बनाओ मोंगो/नेवला (या कुछ अन्य ODM) monotonic _id रों के बजाय पूर्ण UUID के साथ अच्छी तरह से खेलते हैं या 2) इसके अलावा में नेवला मॉडल के लिए एक UUID फ़ील्ड जोड़ें _id फ़ील्ड में और इस दृष्टिकोण के नुकसान से लड़ें। मैं विकल्प # 1 चुनने और ऑब्जेक्ट आईडी संदर्भों के साथ समस्याओं में भाग लेने का प्रयास कर रहा हूं।

मैं मूल रूप से mongoose-uuid पर ठोकर खाई, लेकिन दुर्भाग्य से यह ठीक से मेरी यूज-केस के लिए काम नहीं कर रहा है क्योंकि यह मेरी स्पष्ट रूप से निर्धारित _id मूल्य अधिलेखित किया गया था जब नई नेवला वस्तुओं का निर्माण। प्लगइन कोड में डाइविंग, यह मानता है कि एक ऑब्जेक्ट नया है (मोंगोस के .isNew मूल्य की जांच करने के लिए कॉल करके) और इस प्रकार _id को एक नए यूआईआईडी के साथ ओवरराइट करता है। चूंकि मुझे मोंगो में नए दस्तावेज़ बनाने के दौरान मूल यूयूआईडी बनाए रखने की आवश्यकता है, इसलिए यह प्लगइन मेरे लिए काम नहीं कर रहा है।

इसके बाद, मैं हारून Heckmann, नेवला के निर्माता द्वारा एक post पाया, एक समान विषय पर। यह सहायक रहा है, हालांकि अब मुझे समस्या का सामना करना पड़ रहा है जहां मेरे ऑब्जेक्टिड द्वारा मेरे मोंगोज़ स्कीमा एक दूसरे का संदर्भ नहीं ले सकते हैं, क्योंकि वे तकनीकी रूप से अब स्ट्रिंग `_ids का उपयोग करके एक-दूसरे का संदर्भ दे रहे हैं।

स्कीमा उदाहरण:

var mongoose = require('mongoose'); 
var uuid = require('node-uuid'); 

var Schema = mongoose.Schema; 

var trackPassSchema = new Schema({ 
    _id: { type: String, default: function genUUID() { 
     uuid.v1() 
    }}, 
    //Omitting other fields in snippet for simplicity 
    vehicle: [ 
     {type: Schema.Types.ObjectId, required: true, ref: 'Vehicle'} 
    ] 
}); 

module.exports = mongoose.model('TrackPass', trackPassSchema); 

संदर्भित स्कीमा:

var mongoose = require('mongoose'); 
var uuid = require('node-uuid'); 

var Schema = mongoose.Schema; 

var vehicleSchema = new Schema({ 
    _id: { type: String, default: function genUUID() { 
     uuid.v1() 
    }}, 
    //Omitting other fields in snippet for simplicity 
    description: {type: String}, 
    year: {type: Number} 
}); 

module.exports = mongoose.model('Vehicle', vehicleSchema); 

जब मैं save() एक trackPass कि में अपने आवेदन से पारित किया गया है कॉल करने का प्रयास:

var trackPass = new TrackPass(req.body); 

//Force the ID to match what was put into the request 
trackPass._id = req.params.id; 
trackPass.save(function (err) { ... } 

मैं निम्न त्रुटि:

{ [CastError: Cast to ObjectId failed for value "b205ac4d-fd96-4b1e-892a-d4fab818ea2a" at path "vehicle"] 
    message: 'Cast to ObjectId failed for value "b205ac4d-fd96-4b1e-892a-d4fab818ea2a" at path "vehicle"', 
    name: 'CastError', 
    type: 'ObjectId', 
    value: ["b205ac4d-fd96-4b1e-892a-d4fab818ea2a"], 
    path: 'vehicle' } 

मेरा मानना ​​है कि के रूप में मैं अब स्ट्रिंग्स जो ठेठ मोंगो ObjectIDs से अधिक लंबे उपयोग कर रहा हूँ इस त्रुटि समझ में आता है। ऑब्जेक्ट आईडी संदर्भ के बिना, मुझे विश्वास नहीं है कि मैं अन्य संग्रहों से populate() संदर्भित वस्तुओं को सक्षम कर पाऊंगा। मुझे लगता है कि मैं अपनी स्कीमा परिभाषाओं में अन्य घोंसले वाली वस्तुओं का संदर्भ नहीं दे सकता, हालांकि मुझे इस दृष्टिकोण को पसंद नहीं है क्योंकि मुझे लगता है कि मैं ओडीएम का उपयोग करने के बहुत सारे लाभ खो दूंगा। कोई अन्य विचार?

उत्तर

14

आप अभी भी populate() का उपयोग _id ऑब्जेक्ट आईडी के अलावा प्रकारों के मानों के साथ कर सकते हैं, लेकिन आपको संदर्भ परिभाषा में एक ही प्रकार का उपयोग करने की आवश्यकता है।`_ Id:

var trackPassSchema = new Schema({ 
    _id: { type: String, default: function genUUID() { 
     uuid.v1() 
    }}, 
    vehicle: [ 
     {type: String, required: true, ref: 'Vehicle'} 
    ] 
}); 

एडम टिप्पणी में नोट के रूप में, आप अपने default मूल्य को आसान बनाने में कर सकता है:

var trackPassSchema = new Schema({ 
    _id: { type: String, default: uuid.v1 }, 
    vehicle: [ 
     {type: String, required: true, ref: 'Vehicle'} 
    ] 
}); 
+6

आप इस एक छोटे से आसान बनाने में कर सकता है

तो अपने trackPassSchema को बदलने के लिए की आवश्यकता होगी : {टाइप: स्ट्रिंग, डिफ़ॉल्ट: uuid.v1} ' –

+0

@AdamC आपके सुझाव से इस ऑब्जेक्ट के जीवनकाल के दौरान उत्पन्न यूयूआईडी स्थिर रहेगा। –

+2

नहीं, यह अच्छा है। 'डिफ़ॉल्ट: uuid.v1() 'में वह समस्या होगी, लेकिन डिफ़ॉल्ट नहीं: uuid.v1'। – JohnnyHK

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