2012-01-05 19 views
19

के भीतर मोंगोस स्कीमा मैं किसी अन्य स्कीमा में स्कीमा कैसे जोड़ सकता हूं? यह मान्य होने के लिए प्रतीत नहीं होता:स्कीमा

var UserSchema = new Schema({ 
    name  : String, 
    app_key  : String, 
    app_secret : String 
}) 



var TaskSchema = new Schema({ 
    name   : String, 
    lastPerformed : Date, 
    folder   : String, 
    user   : UserSchema 
}) 

मैं वेबसाइट की जाँच की है और यह कैसे एक सरणी के लिए लेकिन एक के लिए नहीं यह घोषणा को दर्शाता है।

धन्यवाद

+0

क्या आप दो संग्रहों के बीच शामिल हो रहे हैं या आप उन्हें कार्य के शीर्ष पर स्टोर करना चाहते हैं? विस्तृत उत्तर के लिए –

उत्तर

26

ऐसा करने के कुछ तरीके हैं।

var TaskSchema = new Schema({ 
    name   : String, 
    lastPerformed : Date, 
    folder   : String, 
    user   : Schema.ObjectId 
}); 

तो फिर तुम बस सुनिश्चित करें कि आपके एप्लिकेशन कि आईडी लेखन और प्रश्नों में इसका उपयोग करने के रूप में आवश्यक "संबंधित" डाटा को लाना है बनाने के लिए है: सरल सिर्फ इस है।

यह ठीक है जब उपयोगकर्ता आईडी से कार्य खोज, लेकिन अधिक बोझिल काम आईडी से उपयोगकर्ता की क्वेरी जब है:

// Get tasks with user id 
Task.find({user: user_id}, function(err, tasks) {...}); 

// Get user from task id 
Task.findById(id, function(err, task) { 
    User.findById(task.user, function(err, user) { 
    // do stuff with user 
    } 
} 

एक और तरीका है नेवला के populate सुविधा का लाभ लेने के लिए आपके प्रश्नों को आसान बनाने के लिए है। इस के लिए, आप निम्न कर सकता है:

var UserSchema = new Schema({ 
    name  : String, 
    app_key  : String, 
    app_secret : String, 
    tasks  : [{type: Schema.ObjectId, ref: 'Task'}] // assuming you name your model Task 
}); 

var TaskSchema = new Schema({ 
    name   : String, 
    lastPerformed : Date, 
    folder   : String, 
    user   : {type: Schema.ObjectId, ref: 'User'} // assuming you name your model User 
}); 
इस के साथ

, सभी उपयोगकर्ताओं के लिए आपकी क्वेरी, उनके कार्यों की सारणियों सहित हो सकता है:

User.find({}).populate('tasks').run(function(err, users) { 
    // do something 
}); 
बेशक

, इसका मतलब है में आईडी को बनाए रखने दोनों स्थान। यदि यह आपको परेशान करता है, तो पहली विधि से चिपकना सबसे अच्छा हो सकता है और केवल अधिक जटिल (लेकिन अभी भी पर्याप्त सरल) प्रश्न लिखने के लिए उपयोग किया जा सकता है।

+0

धन्यवाद। मेरे पास एक और सवाल है लेकिन शायद मुझे एक नया सवाल बनाना चाहिए। – 0xSina

+2

'.run()' को '.exec()' द्वारा प्रतिस्थापित किया गया था क्योंकि ऐसा लगता है कि –

+0

अन्य [लिंक] [1], [populate] [2] के साथ, आपकी भी मदद कर सकता है। [1]: http://gistflow.com/posts/46-mongoose-populate [2]: http://mongoosejs.com/docs/populate.html –

8

इस सरल समाधान के बारे में क्या?

var TaskSchema = new Schema({ 
    name   : String, 
    lastPerformed : Date, 
    folder   : String, 
    user   : { 
     name  : String, 
     app_key  : String, 
     app_secret : String 
    } 
}) 
+6

क्या यह क्वेरी करने की क्षमता को समाप्त नहीं करेगा उपयोगकर्ता सीधे, और संभावित रूप से कई वस्तुओं में डुप्लीकेट किए जाने वाले उपयोगकर्ता ऑब्जेक्ट्स का नेतृत्व भी करते हैं? यदि आप डेटा मॉडल को केवल एक संरचना में फ़्लैट करने जा रहे थे, तो मुझे लगता है कि आप चाहते हैं कि उपयोगकर्ता स्केमा अन्य तरीकों की बजाय कार्यों का अभिभावक बनें। – VictorB

+0

कोड को गन्दा लग रहा है। इसलिए स्कीमा के भीतर स्कीमा चाहता था –