2012-05-18 12 views
6

मेरे पास एक ब्लॉग संग्रह है जिसमें शीर्षक, शरीर और एग्रीगेट रेटिंग शामिल है जो उपयोगकर्ताओं ने उन्हें दी है। एक और संग्रह 'रेटिंग' जिसका स्कीमा ब्लॉग का संदर्भ लेता है, उपयोगकर्ता जिसने रेट किया है (यदि वह बिल्कुल उन्हें रेट करता है) तो यह उनके ऑब्जेक्ट आईडी के रूप में और रेटिंग जो उन्होंने दिया है, +1 या -1।mongodb और nodejs में ब्लॉगिंग और रेटिंग मॉडलिंग

एक विशेष उपयोगकर्ता की नवीनतम पहले 'क्रम में ब्लॉग के माध्यम ब्राउज़ करता है (प्रति पृष्ठ उनमें से 40 का कहना है। उन्हें blogs[0]blogs[39] करने की एक सरणी कॉल) मैं इस विशेष उपयोगकर्ता और उन 40 से संबंधित रेटिंग दस्तावेजों को पुनः प्राप्त करने के लिए है ब्लॉग अगर सभी उपयोगकर्ताओं ने उन्हें रेट किया है और उन्हें सूचित किया है कि उन्होंने उन ब्लॉगों को क्या रेटिंग दी है।

मैंने किसी विशेष उपयोगकर्ता के सभी रेटिंग दस्तावेज़ निकालने का प्रयास किया जिसमें ब्लॉग संदर्भ ऑब्जेक्ट आईडी blogs[0]._id और blogs[39]._id के बीच है जो मेरे मामले में खाली सूची देता है। ऑब्जेक्ट हो सकता है आईडी $lt और $gt क्वेरी का उपयोग करके तुलना नहीं की जा सकती है। उस मामले में मुझे इसके बारे में कैसे जाना चाहिए? क्या मुझे इस परिदृश्य में फिट करने के लिए अपने स्कीमा को फिर से डिजाइन करना चाहिए?

मैं इस मामले के लिए mongoosejs ड्राइवर का उपयोग कर रहा हूं। यहां कोड के प्रासंगिक भाग हैं जो निष्पादन में थोड़ा भिन्न हैं लेकिन आपको विचार मिलता है।

स्कीमा:

Client= new mongoose.Schema({ 
    ip:String 
}) 

Rates = new mongoose.Schema({ 
    client:ObjectId, 
    newsid:ObjectId, 
    rate:Number 
}) 

News = new mongoose.Schema({ 
    title: String, 
    body: String, 
    likes:{type:Number,default:0}, 
    dislikes:{type:Number,default:0}, 
    created:Date, 
    // tag:String, 
    client:ObjectId, 
    tag:String, 
    ff:{type:Number,default:20} 
}); 

मॉडल:

var newsm=mongoose.model('News', News); 
var clientm=mongoose.model('Client', Client); 
var ratesm=mongoose.model('Rates', Rates); 

तर्क:

newsm.find({tag:tag[req.params.tag_id]},[],{ sort:{created:-1},limit: buffer+1 },function(err,news){ 

ratesm.find({client:client._id,newsid:{$lte:news[0]._id,$gte:news.slice(-1)[0]._id}},function(err,ratings){ 
}) 
}) 

संपादित करें: को लागू करते समय नीचे कहा स्कीमा, मैं नेवला में इस क्वेरी करना था। जेएस

> db.blogposts.findOne() 
{ title : "My First Post", author: "Jane", 
    comments : [{ by: "Abe", text: "First" }, 
       { by : "Ada", text : "Good post" } ] 
} 
> db.blogposts.find({ "comments.by" : "Ada" }) 

मैं यह प्रश्न mongoose में कैसे करूं?

उत्तर

4

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

{ 
    title: "My New Post", 
    body: "Here's my new post. It is great. ...", 
    likes: 20, 
    dislikes: 5, 
    ... 
    rates: [ 
    { client_id: (id of client), rate: 5 }, 
    { client_id: (id of another client), rate: 3 }, 
    { client_id: (id of a third client), rate: 10 } 
    ] 
} 

विचार किया जा रहा है कि rates सरणी में वस्तुओं सभी शामिल जिस डेटा को आपको ब्लॉग एंट्री प्रदर्शित करने की आवश्यकता होगी, रेटिंग के साथ पूर्ण करें, ठीक उसी दस्तावेज़ में। यदि आपको दरों को अन्य तरीकों से पूछने की भी आवश्यकता है (उदाहरण के लिए उपयोगकर्ता एक्स द्वारा बनाई गई सभी रेटिंग खोजें), और साइट पढ़ने-भारी है, तो आप भी पर विचार कर सकते हैं Rates संग्रह में डेटा संग्रहीत करते हुए अब आप कर रहे हैं । निश्चित रूप से, डेटा दो स्थानों पर है, और अपडेट करना मुश्किल है, लेकिन यह आपके ऐप का विश्लेषण करने और यह आपके डेटा तक पहुंचने के बाद एक समग्र जीत हो सकता है।

ध्यान दें कि आप किसी दस्तावेज़ की संरचना में गहराई से इंडेक्स लागू कर सकते हैं, उदाहरण के लिए आप News.rates.client_id को इंडेक्स कर सकते हैं, और फिर आप News संग्रह में किसी भी दस्तावेज़ को तुरंत प्राप्त कर सकते हैं जिसे किसी विशेष उपयोगकर्ता ने रेट किया है।

+0

ठीक है। मैंने आपके स्कीमा को बदल दिया जैसा आपने कहा था लेकिन मुझे अभी भी समस्या है कि मुझे किसी दिए गए ब्लॉग सेट के लिए उपयोगकर्ता द्वारा दी गई रेटिंग कैसे प्राप्त होती है। क्या आप कृपया विशिष्ट एपीआई के बारे में भी मेरी मदद कर सकते हैं? @ ब्रैंडन –

+2

क्या होगा यदि किसी आइटम के लिए लाखों दरें हैं? क्या यह उस तरह की स्कीमा के लिए एक समस्या है? – Burak

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