2012-08-11 13 views
19

मोंगोडीबी/मोंगोस में, मैं रिश्ते को कैसे परिभाषित करूं? मुझे लगता है कि मैंने देखा है कि कुछ तरीके हैं, लेकिन मुझे यकीन नहीं है कि मैं मतभेदों को समझता हूं या मैं किसका उपयोग करता हूं। मैं मोंगोस 3मोंगोस में रिश्ते और विदेशी कुंजी को समझना

मैंने Todo और TodoList मॉडल को परिभाषित किया है, जहां संबंध स्पष्ट है। तो डॉक्स http://mongoosejs.com/docs/documents.html निम्नलिखित, मैं परिभाषित किया है वर्गों की तरह:

# Todo.coffee 
mongoose = require "mongoose" 

todoSchema = mongoose.Schema 
    name: String 
    desc: String 
    dueOn: Date 
    completedOn: Date 

module.exports = mongoose.model "Todo", todoSchema 

# TodoList.coffee 

mongoose = require "mongoose" 
Todo = require "./Todo" 

todoListSchema = mongoose.Schema 
    name: String 
    todos: [Todo.schema] 

module.exports = mongoose.model "TodoList", todoListSchema 

तब मैं कक्षाओं का परीक्षण करने की कोशिश की:

list = new TodoList 
    name: "List 1" 
    todos: [ 
     { name: "Todo 1", desc: "Hello", dueOn: new Date(2012,10,1), completedOn: new Date(2012,10,2) } 
     { name: "Todo 2" } 
     { name: "Todo 3", desc: "Hello 2", dueOn: new Date(2012,10,6), completedOn: new Date(2012,10,2) } 
     { name: "Todo 4" } 
    ] 
#list.todos.push { name: "Todo 5" } 
console.log "List", list 
list.save (err) -> 
    if !err 
     TodoList.find {}, (err, lists) -> 
      console.log "TODOS" 
      console.log lists.length, lists 
      done(err) 
    else 
     console.log "ERROR!!!" 
     done err 

जब मैं Todo.find() मैं कुछ भी नहीं मिल करने की कोशिश है, तो मॉडल (Todo.coffee) अनावश्यक है? ऐसा लगता है कि TodoTodoList में संग्रहीत है, ऐसे उपयोगकर्ता के रूप में जो मुझे परवाह नहीं है, लेकिन मुझे आश्चर्य है कि क्या प्रभाव हैं? उदाहरण के लिए। क्या दस्तावेज़ बहुत बड़ा हो जाएगा? 1 TodoList बहुत सारे Todos के साथ? क्या वो वजह बन रही हे? क्या होगा यदि मैं नेस्टेड टोडोस को अनुमति देता हूं (नहीं कि मैं समझने के लिए इसे करना चाहता हूं), तो क्या दस्तावेजों को अलग से स्टोर करना बेहतर है? मैं ऐसा कैसे करूं, अगर मैं चाहूं, और मैं इसे कब करूं?

मैंने एक और तरीका देखा, मोंगोस 2 में वास्तव में, अगर यह 3 में संभव है, तो घोंसला वाले दस्तावेज़ों के बजाय ObjectId का उपयोग करने जैसा कुछ। हो सकता है कि इसे अलग से स्टोर किया जाए?

उत्तर

34

मैं अभी भी नोड, मोंगोस और मोंगो के लिए नया हूं, लेकिन मुझे लगता है कि मैं आपके प्रश्न का कम से कम हिस्सा संबोधित कर सकता हूं। :)

आपकी वर्तमान विधि वही है जैसा मैंने पहले करने की कोशिश की थी। असल में, यह यह बहुत ही इस के लिए इसी तरह के भंडारण (जे एस में लिखा, के बाद से मैं CoffeeScript पता नहीं है) समाप्त होता है:

var todoListSchema = new mongoose.Schema({ 
    name: String, 
    todos: [{ 
     name: String, 
     desc: String, 
     dueOn: Date, 
     completedOn: Date 
    }] 
}); 

मैं बाद में इस विधि है, जो मैं के लिए क्या देख रहा था है पाया, और मुझे लगता है कि क्या आप इच्छुक गया:

var todoListSchema = new mongoose.Schema({ 
    name: String, 
    todos: [{ 
     type: mongoose.Schema.Types.ObjectId, 
     ref: 'Todo' //Edit: I'd put the schema. Silly me. 
    }] 
}); 

यह ObjectIds, जिसे फिर आप नेवला में Query#populate का उपयोग कर लोड कर सकते हैं की एक सरणी संग्रहीत करता है।

मुझे तकनीकी प्रभावों के बारे में पता नहीं है, लेकिन अगर मैं उन्हें अलग रखता हूं तो यह मेरे दिमाग में अधिक समझ में आता है, इसलिए मैं यही कर रहा हूं। :)

संपादित करें: http://mongoosejs.com/docs/populate.html

+4

Schema.Types.ObjectId एक v2 अनुकूलता संस्करण है: यहाँ एक कुछ सरकारी डॉक्स कि उपयोगी हो सकता है है Schema.ObjectId; यह मुझे थोड़ी देर के लिए उलझन में था –

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