2012-05-18 14 views
6

我有一個博客集合,其中包含用戶給他們的標題,主體和集合評級。另一個「評分」集合的模式參考了博客,用戶評價(如果他根本評價他們的話)它以ObjectIds的形式和他們給出的評分即+1,-1。在mongodb和nodejs中建模博客和評分

當特定用戶瀏覽的「最新第一」爲了部落格(說每頁他們的40。打電話給他們的blogs[0]blogs[39]數組)我需要檢索與此相關的特定的用戶和那些40評級文件如果在所有的用戶評價他們,並通知他他給了這些博客什麼等級的博客。

我試圖提取一個特定用戶的所有評級文件,其中博客參考對象ID位於blogs[0]._idblogs[39]._id之間,在我的情況下它返回空列表。可能是objectIds不能使用$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){ 
}) 
}) 

編輯: 儘管實現了低於所述的模式,我在貓鼬做到這一點查詢。 js

> 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" }) 

如何在貓鼬中執行此查詢?

回答

4

MongoDB(和其他非關係數據存儲)的一個好的做法是對數據建模,以便在應用程序中使用/查詢。在你的情況,你可能會考慮非規範化結構的位和存儲博客收集的評比權,因此博客可能是這個樣子:

{ 
    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數組中的對象包含所有您需要在單個文檔中顯示博客條目並附帶評分的數據。如果您還需要以其他方式查詢費率(例如查找用戶X所做的所有評級),並且該網站是重讀的,則可以考慮將數據存儲在Rates集合中,就像您現在正在做的那樣。當然,這些數據分佈在兩個地方,而且很難更新,但是在分析你的應用程序以及它如何訪問你的數據之後,這可能是一個全面的勝利。

請注意,您可以將索引深度應用到文檔結構中,例如,您可以索引News.rates.client_id,然後您可以快速查找特定用戶評分過的News集合中的任何文檔。

+0

好的。我按照你的說法改變了我的模式,但我仍然對如何獲得用戶給定的給定博客集的評分有問題。你能幫我關於具體的api嗎? @Brandon –

+2

如果有一個項目有數百萬的價格怎麼辦?這種模式是否存在問題? – Burak