2013-01-16 22 views
18

मैं एक एसक्यूएल पृष्ठभूमि इतना एसक्यूएल में प्रश्नों जहां मैं टेबल में शामिल होने के लेखन से आने वाले से आते हैं काफी सरल है, लेकिन मुझे लगता है कि मुझे याद आ रही नेवला/MongoDB मेंनेवला/MongoDB क्वेरी मिलती है .. लेकिन मैं एक एसक्यूएल पृष्ठभूमि

कि असल में मैं सब्सक्राइबर_आईडी (जो उपयोगकर्ता संग्रह में किसी दस्तावेज़ को मैप करता है)

मैं प्रोजेक्ट समूह को खींचना चाहता हूं, जिसमें सभी परियोजनाएं उपयोगकर्ता हैं, इसलिए यदि मैं pseduo sql में इसे लिखना चाहता हूं तो यह होगा

Select 
    ProjectGroup.title, 
    Project.Title 
FROM 
    ProjectGroup, 
    Project, 
    User 
WHERE 
    User.id = req.body.subscriber_id 
    AND Project.subscriber_id = User.id 
    AND ProjectGroup.project_id = Project.id 

si करने का एक तरीका होना चाहिए mongoose/mongodb में परिचित जुड़ता है क्योंकि टाइप स्कीमा के लिए मैपिंग सही है?

मेरे स्कीमा .....

परियोजना समूह स्कीमा

var ProjectGroupSchema = new Schema({ 
    title    : String 
    , projects   : [ { type: Schema.Types.ObjectId, ref: 'Project' } ] 
}); 

परियोजना स्कीमा

var ProjectSchema = new Schema({ 
    title   : {type : String, default : '', required : true} 
    , subscribers : [{ type: Schema.Types.ObjectId, ref: 'User' }] 
}); 

उपयोगकर्ता स्कीमा

var UserSchema = new Schema({ 
    first_name : {type: String, required: true} 
    , last_name  : {type: String, required: true} 
}); 

धन्यवाद!

उत्तर

41

आप केवल एक कदम दूर हैं!

परियोजना समूह स्कीमा:

var ProjectGroupSchema = new Schema({ 
    title    : String 
}); 

परियोजना स्कीमा:

var ProjectSchema = new Schema({ 
    title   : {type : String, default : '', required : true}, 
    group   : {type: Schema.Types.ObjectId, ref: 'ProjectGroup' }, 
    _users : [{type: Schema.Types.ObjectId, ref: 'User' }] 
}); 

उपयोगकर्ता स्कीमा:

user.findById(req.userId) 
    .populate('subscribing') 
    .exec(function(err, user){ 
      console.log(user.subscribing); 
    }) 
:

var UserSchema = new Schema({ 
    first_name : {type: String, required: true}, 
    last_name  : {type: String, required: true}, 
    subscribing : [{type: Schema.Types.ObjectId, ref: 'Project' }] 
}); 

तो आप निम्न कर सकते

या:

project.find({ 
     subscriber : req.userId 
     }) 
    .populate('subscriber') 
    .populate('group') 
    .exec(function(err, projects){ 
      console.log(projects); 
    }) 
+2

बहुत रोचक मैं इसे लागू करूंगा और देख सकता हूं कि यह कैसे काम करता है लेकिन दूसरा जो आप उल्लेख करते हैं वह बिल्कुल वैसा ही दिखता है जो मुझे चाहिए। – nwkeeley

+1

ठीक है मैंने अभी अपने स्कीमा संदर्भों को अपडेट किया है और इन populates पूरी तरह से काम किया है! – nwkeeley

+0

यह कमाल है, लेकिन क्या आप निष्पादन से रिटर्न परिणाम संशोधित कर सकते हैं, कहें कि क्या मैं समूह फ़ील्ड शामिल नहीं करना चाहता हूं। – Bruce

2

Mongodb में कोई भी शामिल नहीं है। यह सवाल मुझे लगता है कि एक अच्छा संदर्भ है:

MongoDB and "joins"

संक्षेप में, विभिन्न रणनीतियों समस्याओं के माध्यम से संबंधपरक डीबीएस में मिलती है संबोधित किया जाएगा के लिए MongoDB के साथ अपनाया जाना है। मैं कहूंगा कि आप मुख्य रूप से अंततः इन दो चीजों में से एक कर रहे हैं:

  • एम्बेडिंग: आप एक दस्तावेज़ में जानकारी एम्बेड करते हैं जो विभिन्न तालिकाओं के बीच डीबी को वितरित किया जाएगा।
  • जानकारी क्लाइंट-साइड में शामिल होना: जब आपको कई स्थानों से जानकारी का उपयोग करने की आवश्यकता होती है, तो आप कई बार पूछते हैं और फिर अपने क्लाइंट में टुकड़े एक साथ रख देते हैं।
+0

हाँ है कि यह स्पष्ट करने के लिए एक महान पोस्ट है ... अब बस समय लागू करने के लिए! – nwkeeley