2012-05-18 16 views
6

Tôi có một bộ sưu tập blog chứa tiêu đề, nội dung và xếp hạng tổng hợp mà người dùng đã cung cấp cho họ. Một bộ sưu tập 'Xếp hạng' khác có lược đồ có liên quan đến blog, người dùng đã xếp hạng (nếu anh ấy xếp hạng) nó dưới dạng ObjectIds của họ và xếp hạng họ đã đưa ra tức là., +1 hoặc -1.Lập mô hình các blog và xếp hạng trong mongodb và nodejs

Khi một người dùng cụ thể duyệt qua các blog theo thứ tự 'mới nhất đầu tiên' (nói 40 trong số đó mỗi trang. Gọi cho họ một mảng của blogs[0]-blogs[39]) Tôi có để lấy tài liệu giá liên quan đến người dùng cụ thể này và những người 40 blog nếu ở tất cả người dùng đã xếp hạng và thông báo cho anh ấy về xếp hạng anh ấy đã cung cấp cho các blog đó.

Tôi cố gắng để trích xuất tất cả các văn bản đánh giá của một người dùng cụ thể, trong đó objectIds viết blog tham khảo nằm giữa blogs[0]._idblogs[39]._id trả về danh sách sản phẩm nào trong trường hợp của tôi. Có thể không thể so sánh đối tượng bằng cách sử dụng các truy vấn $lt$gt. Trong trường hợp đó làm thế nào tôi nên đi về nó? Tôi có nên thiết kế lại các lược đồ của mình để phù hợp với kịch bản này không?

Tôi đang sử dụng trình điều khiển mongoosejs cho trường hợp này. Dưới đây là các phần liên quan của mã khác nhau một chút trong thực thi nhưng bạn sẽ có được ý tưởng.

Schemas:

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

mô hình:

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

Logic:

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

Edit: Trong khi thực hiện dưới đây nói schema, tôi đã phải làm truy vấn này trong cầy mangut. 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" }) 

Làm cách nào để thực hiện truy vấn này trong mongoose?

Trả lời

4

Thực hành tốt với MongoDB (và các kho dữ liệu phi quan hệ khác) là mô hình hóa dữ liệu của bạn để dễ sử dụng/truy vấn trong ứng dụng của bạn. Trong trường hợp của bạn, bạn có thể xem xét denormalizing cấu trúc một chút và lưu trữ các xếp hạng ngay trong bộ sưu tập blog, do đó, một blog có thể trông giống như thế này:

{ 
    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 } 
    ] 
} 

Ý tưởng được rằng các đối tượng trong mảng rates chứa tất cả dữ liệu bạn cần để hiển thị mục nhập blog, hoàn chỉnh với xếp hạng, ngay trong tài liệu duy nhất. Nếu bạn cũng cần truy vấn tỷ lệ theo cách khác (ví dụ: tìm tất cả xếp hạng do người dùng X thực hiện) và trang web được đọc nhiều, bạn có thể xem xét cũng lưu trữ dữ liệu trong bộ sưu tập Rates khi bạn đang làm bây giờ . Chắc chắn, dữ liệu ở hai nơi và khó cập nhật hơn, nhưng nó có thể là một chiến thắng tổng thể sau khi bạn phân tích ứng dụng của mình và cách nó truy cập dữ liệu của bạn. Lưu ý rằng bạn có thể áp dụng các chỉ mục sâu vào cấu trúc của tài liệu, ví dụ bạn có thể lập chỉ mục News.rates.client_id và sau đó bạn có thể nhanh chóng tìm thấy bất kỳ tài liệu nào trong bộ sưu tập News mà người dùng cụ thể đã xếp hạng.

+0

ok. Tôi đã thay đổi các lược đồ của tôi như bạn đã nói nhưng tôi vẫn gặp vấn đề về cách tôi nhận được xếp hạng do người dùng đưa ra cho một tập hợp blog đã cho. Bạn có thể vui lòng giúp tôi về api cụ thể không? @Brandon –

+2

Điều gì xảy ra nếu có hàng triệu tỷ giá cho một mặt hàng? Đây có phải là vấn đề đối với loại lược đồ đó không? – Burak

Các vấn đề liên quan