2011-12-05 22 views
5

में एम्बेडेड ऑब्जेक्ट्स खोजना उदाहरण के लिए यदि मेरे पास निम्न स्कीमा है (ब्रेवटी के लिए बहुत सरल है)। मैं टैग द्वारा पोस्ट की खोज कैसे कर सकता हूं? मुझे पता है कि टैग दस्तावेज़ संग्रह को एम्बेड किया गया था, लेकिन मैं टैग को अपने संग्रह में रखना चाहता हूं।मोंगोस

PostSchema = new Schema({ 
    title: String 
    body: String 
    tags: [{type: Schema.ObjectId, ref: 'Tag' }] 
}); 

TagSchema = new Schema({ 
    name: String 
}); 

// Here is what I've tried 
Post.find({'tags.name':'javascript'}) 
    .populate('tags') // Is it necessary to join the collections? 
    .run(function(err, posts) { 
     console.log('posts: ', posts); 
    }); 
+0

क्या यह आपके कोड में 'post.find ({' tag.name ':' javascript '}) नहीं होना चाहिए? –

+0

हां रिकार्डो। मैं अप्रासंगिक सामान को बाहर निकालने की कोशिश कर रहा था, जिसमें गलत सवाल था। –

उत्तर

3

टैग के लिए एक स्कीमा सबसे अच्छा तरीका चल रहा है? इस तरह कुछ आसान काम करना चाहिए:

Posts = new Schema({ 
    title: String 
    body: String 
    tags: [String] 
}) 

// ... 

Posts.find({ tags: { $in: ['javascript'] }, function(err, posts){ 
    console.log(posts) 
}) 
+0

इस उदाहरण में मुझे लगता है कि आपका सही है। मैंने तब से अधिक स्वीकार्य स्ट्रिंग ऐरे दृष्टिकोण में फिर से काम किया है .. और गिनती और अद्वितीय टैग इत्यादि पाने के लिए यहां [link] (http://cookbook.mongodb.org/patterns/count_tags/) के रूप में उल्लिखित एक मानचित्रित संग्रह का उपयोग किया है। संबंधपरक डेटाबेस दिमाग सेट से बाहर निकलने के लिए। –

4

आप एम्बेडेड डॉक्स क्वेरी करने के लिए नेवला साथ object.field संकेतन का उपयोग करने के लिए सक्षम होना चाहिए। हालांकि, आपको यह सुनिश्चित करने की आवश्यकता हो सकती है कि आपके एम्बेडेड दस्तावेज़ में स्कीमा के हिस्से के रूप में घोषित सभी फ़ील्ड हैं (आपके नमूने में, आप "टिप्पणियां.नाम" पर पूछताछ करते हैं लेकिन पोस्टस्केमा के पास कोई टिप्पणी फ़ील्ड नहीं है - शायद यह समस्या पैदा कर रहा है?)

मैं इस तरह काम कर अवधारणा का एक सबूत प्राप्त करने में सक्षम था, जो सफलतापूर्वक चलाना चाहिए के रूप में है:

var mongoose = require('mongoose') 
var Schema = mongoose.Schema 

mongoose.connect('mongodb://localhost/testjs'); 


PostSchema = new Schema({ 
    title: String, 
    body: String, 
    comments: [], 
    tags: [{type: Schema.ObjectId, ref: 'Tag' }] 
}); 

TagSchema = new Schema({ 
    name: String 
}); 


var Post = mongoose.model('Post', PostSchema); 

var mypost = new Post() 
mypost.title = "yo" 
mypost.body = "asfkjabfkjbsdf" 
mypost.comments = [{'name':'javascript', 'text':'sup'}] 
mypost.save(
    function(err){ 
    // Save the post, and then read it back by querying the embedded field 
    Post.find({'comments.name':'javascript'},function(err, posts){ 
     console.log('posts: ', posts); 
    }); 
    } 
); 
+0

को पकड़ने के लिए धन्यवाद, मैं माफी माँगता हूं कि मेरा प्रारंभिक कोड स्निपेट हेला भ्रामक था। मैंने पोस्ट करने से पहले आपके दृष्टिकोण की कोशिश की है, लेकिन यदि आप ऊपर दिए गए एक एम्बेडेड दस्तावेज़ की बजाय ऑब्जेक्टआईड की एम्बेडेड सरणी का उपयोग करते हैं तो यह काम नहीं करता है। –

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