MongoDB
 sql >> Cơ Sở Dữ Liệu >  >> NoSQL >> MongoDB

Thiết kế lược đồ MongoDB - Bỏ phiếu cho bài đăng

Cách phổ biến để theo dõi tổng số phiếu bầu là giữ nguyên số phiếu bầu trong tài liệu bài đăng và cập nhật nó nguyên tử khi đẩy một giá trị mới vào mảng phiếu bầu.

Vì đây là một bản cập nhật duy nhất nên bạn được đảm bảo rằng số lượng sẽ khớp với số phần tử trong mảng.

Nếu số lượng tổng hợp được cố định và trang web rất bận rộn, bạn có thể mở rộng mô hình này và tăng thêm các bộ đếm bổ sung, như một bộ đếm cho tháng, ngày và giờ, nhưng điều đó có thể nhanh chóng trở nên khó khăn. Vì vậy, thay vào đó, bạn có thể sử dụng Khung tổng hợp mới (có sẵn trong bản phát hành 2.1.2 dành cho nhà phát triển, sẽ được sản xuất trong bản phát hành 2.2. Nó đơn giản hơn để sử dụng so với Map / Reduce và nó sẽ cho phép bạn thực hiện các phép tính mà bạn muốn rất đơn giản, đặc biệt nếu bạn cẩn thận lưu trữ ngày bỏ phiếu của mình như Loại ISODate ().

Quy trình điển hình cho truy vấn tổng hợp dành cho những người nhận được nhiều phiếu bầu nhất trong tháng này có thể trông giống như sau:

today = new Date();
thisMonth = new Date(today.getFullYear(),today.getMonth());
thisMonthEnd = new Date(today.getFullYear(),today.getMonth()+1);

db.posts.aggregate( [
    {$match: { "Votes.votedate": {$gte:thisMonth, $lt:thisMonthEnd} } },
    {$unwind: "$Votes" },
    {$match: { "Votes.votedate": {$gte:thisMonth, $lt:thisMonthEnd} } },
    {$group: { _id: "$title", votes: {$sum:1} } },
    {$sort: {"votes": -1} },
    {$limit: 10}
] );

Điều này giới hạn đầu vào cho quy trình đối với các bài đăng có phiếu bầu bằng cách khớp ngày bỏ phiếu với tháng bạn đang kiểm phiếu, "mở" mảng để nhận một tài liệu cho mỗi phiếu bầu và sau đó thực hiện một "nhóm theo" tương đương tổng hợp tất cả phiếu bầu cho mỗi tiêu đề (Tôi cho rằng tiêu đề là duy nhất). Sau đó, nó sắp xếp giảm dần theo số phiếu bầu và giới hạn đầu ra ở mười đầu tiên.

Bạn cũng có khả năng tổng hợp số phiếu bầu theo ngày (ví dụ) cho tháng đó để xem ngày nào hoạt động bình chọn nhiều nhất:

db.posts.aggregate( [
    {$match: { "Votes.votedate": {$gte:thisMonth, $lt:thisMonthEnd} } },
    {$unwind: "$Votes" },
    {$match: { "Votes.votedate": {$gte:thisMonth, $lt:thisMonthEnd} } },
    {$project: { "day" : { "$dayOfMonth" : "$Votes.votedate" }  } },
    {$group: { _id: "$day", votes: {$sum:1} } },
    {$sort: {"votes": -1} },
    {$limit: 10}
] );


  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Đếm thuộc tính tài liệu con trong một phép chiếu bằng cách sử dụng MongoDB và Javascript

  2. Làm cách nào để kết xuất toàn bộ cơ sở dữ liệu MongoDB dưới dạng text / json?

  3. Đường ray tùy chỉnh / tên mối quan hệ mongoid không hoạt động

  4. Mongorestore mong đợi loại tệp hoặc thư mục nào khi sử dụng cờ -d?

  5. làm thế nào để chuyển một biến cho một regex