2012-09-19 16 views
7

मैं बहुत की तरह एक स्कीमा है:नेवला दस्तावेज़ स्कीमा और सत्यापन

class Schemas 

    constructor: -> 
    @mongoose = require 'mongoose' 
    @schema = @mongoose.Schema 

    @EmployeeSchema = new @schema 
     'firstname': { type: String, required: true }, 
     'lastname': { type: String, required: true }, 
     'email': { type: String, required: true, index: { unique: true }, validate: /\b[a-zA-Z0-9._%+-][email protected][a-zA-Z0-9.-]+\.[a-zA-Z]{2,4}\b/ }, 
     'departmentId': { type: @schema.ObjectId, required: true } 
     'enddate': String, 
     'active': { type: Boolean, default: true } 

    @EmployeeSchemaModel = @mongoose.model 'employees', @EmployeeSchema 

    @DepartmentSchema = new @schema 
     'name': { type: String, required: true, index: { unique: true } } 
     'employees' : [ @EmployeeSchema ] 

    @DepartmentSchemaModel = @mongoose.model 'departments', @DepartmentSchema 

तो यह है कि मेरे employees एक department

अंदर employee दस्तावेजों की एक सरणी में रहते हैं मैं कई department दस्तावेजों की एक संख्या है कि है सरणी में संग्रहीत employee दस्तावेज़।

मैंने फिर एक नया department जोड़ा लेकिन इसमें employees नहीं था। यदि मैं के बिना department जोड़ने का प्रयास करता हूं, तो मोंगोस employee.email फ़ील्ड के लिए Duplicate key error उत्पन्न करता है जो एक आवश्यक फ़ील्ड है। employee.email फ़ील्ड आवश्यक और अद्वितीय है, और यह होना आवश्यक है।

क्या वैसे भी इस दौर में है?

उत्तर

6

आप mongoose.set('debug', true); की coffeescript बराबर साथ नेवला डीबग लॉगिंग सक्षम करते हैं कि आप देख सकते क्या हो रहा है:

DEBUG: Mongoose: employees.ensureIndex({ email: 1 }) { safe: true, background: true, unique: true }  
DEBUG: Mongoose: departments.ensureIndex({ name: 1 }) { safe: true, background: true, unique: true }  
DEBUG: Mongoose: departments.ensureIndex({ 'employees.email': 1 }) { safe: true, background: true, unique: true } 

DepartmentSchema की employees सरणी में पूर्ण EmployeeSchema embedding (बजाय यह करने के लिए सिर्फ एक ObjectId संदर्भ से तक), आप employees.email और department.employees.email दोनों पर अद्वितीय अनुक्रमणिका बनाते हैं।

तो जब आप किसी भी कर्मचारी के बिना department बनाते हैं तो आप एक विशिष्टता के रूप में department.employees.email अनुक्रमणिका में अपरिभाषित ईमेल केस का उपयोग कर रहे हैं। तो जब आप कोशिश करते हैं और दूसरी बार ऐसा करते हैं कि अद्वितीय मान पहले ही लिया जा चुका है और आपको Duplicate key error मिलता है।

इसके लिए सबसे अच्छा फिक्स DepartmentSchema.employees को ObjectId पूर्ण ऑब्जेक्ट्स के बजाय कर्मचारियों के संदर्भों में बदलने के लिए संभव है। फिर सूचकांक employees संग्रह में रहता है जहां यह संबंधित है और आप डेटा को डुप्लिकेट नहीं कर रहे हैं और असंगतताओं के अवसर बना रहे हैं।

+0

धन्यवाद जोहनी, मुझे _debug_ कमांड से अवगत नहीं था, जो भविष्य में डीबगिंग के लिए जानना आसान है। न ही मुझे पता था कि मोंगोस 2 इंडेक्स बना रहा था (वास्तव में जब मैंने केवल एक के लिए पूछा था।) मुझे पता था कि मैं 2 अलग-अलग संग्रह बना सकता हूं और 'ऑब्जेक्ट आईडी' के माध्यम से दूसरे को एक _refer_ कर सकता हूं, लेकिन फिर मैं वापस आ गया हूं एक संबंध मॉडल। कई वर्षों तक आरडीएमएस का इस्तेमाल करने के बाद मैं एक एम्बेडेड संरचना का उपयोग करना चाहता था जो इस मॉडल के लिए एक अच्छा फिट प्रतीत होता है। एक समझौता के रूप में मुझे लगता है कि मैं एम्बेडेड कर्मचारी ऑब्जेक्ट के भीतर से _email-address_ संग्रह का उल्लेख कर सकता हूं और एक अद्वितीय अनुक्रमणिका बना सकता हूं। –

0

ऐसा प्रतीत होता है कि आप एक उप-दस्तावेज़ के एक व्यक्तिगत क्षेत्र पर अद्वितीय अनुक्रमणिका नहीं बना सकते हैं। हालांकि मोंगो शैल में db.collection.ensureIndex फ़ंक्शन आपको ऐसा करने देता है, लेकिन यह उप-दस्तावेज़ को पूरे विशिष्टता के लिए पूरे के रूप में परीक्षण करता है, न कि व्यक्तिगत फ़ील्ड।

आप उप-दस्तावेज़ के किसी व्यक्तिगत क्षेत्र पर एक अनुक्रमणिका बना सकते हैं, तो आप इसे अद्वितीय नहीं बना सकते हैं।

+2

आप एक उप दस्तावेज़ क्षेत्र पर एक अद्वितीय सूचकांक बना सकते हैं, लेकिन विशिष्टता पूरा संग्रह और 'कोई मूल्य नहीं' भर में लागू की जाती है अनन्य मानों में से एक माना जाता है। मेरा जवाब देखें – JohnnyHK

1

इन संदर्भों की जाँच करें:

http://docs.mongodb.org/manual/core/indexes/#sparse-indexes

mongoDB/mongoose: unique if not null (विशेष रूप से JohnnyHK का जवाब)

यह की कमी है कि मोंगो 1.8 के बाद से, आप को परिभाषित कर सकते हैं जो एक sparse सूचकांक, कहा जाता है जो केवल यदि मूल्य शून्य नहीं है तो अद्वितीय जांच में kicks।

आपके मामले में, आप चाहेंगे:

@EmployeeSchema = new @schema 
    'firstname': { type: String, required: true }, 
    'lastname': { type: String, required: true }, 
    'email': { type: String, required: true, index: { unique: true, sparse: true }, validate: /\b[a-zA-Z0-9._%+-][email protected][a-zA-Z0-9.-]+\.[a-zA-Z]{2,4}\b/ }, 
    'departmentId': { type: @schema.ObjectId, required: true } 
    'enddate': String, 
    'active': { type: Boolean, default: true } 

सूचना sparse: true EmployeeSchema के ई-मेल विशेषता पर अपने सूचकांक में जोड़ा।

https://gist.github.com/juanpaco/5124144