MongoDB
 sql >> база данни >  >> NoSQL >> MongoDB

Дизайн на схема на MongoDB - гласуване на публикации

Обичайният начин за проследяване на броя на гласовете като цяло е да се запази броят на гласовете в документа за публикуване и да се актуализира атомарно, когато се въвежда нова стойност към масива с гласове.

Тъй като това е единична актуализация, гарантирано ви е, че броят ще съответства на броя на елементите в масива.

Ако броят на агрегациите е фиксиран и сайтът е много натоварен, можете да разширите тази парадигма и да увеличите допълнителни броячи, като един за месец, ден и час, но това може да излезе извън контрол много бързо. Така че вместо това можете да използвате новата Aggregation Framework (достъпно във версия 2.1.2 dev, ще бъде в производство във версия 2.2. Използва се по-лесно от Map/Reduce и ще ви позволи да правите изчисленията, които искате, много просто, особено ако се погрижите да съхранявате датите на гласуването си като Тип ISODate().

Типичният канал за заявка за агрегиране за най-получените гласове този месец може да изглежда по следния начин:

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

Това ограничава въвеждането в конвейера до публикации, които имат гласове, като съпоставя датите на гласуване с месеца, който броите, „развива“ масива, за да получите един документ на глас и след това прави еквивалент „групиране по“, сумирайки всички гласове за всяко заглавие (Предполагам, че заглавието е уникално). След това сортира низходящо по брой гласове и ограничава изхода до първите десет.

Също така имате възможност да събирате гласове по дни (например) за този месец, за да видите кои дни са най-активни за гласуване:

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. Как да управлявате шаблони за конфигурация за вашите бази данни с ClusterControl

  2. Странни резултати от mongoid, използващ Debian squeeze mongodb

  3. потребителски _id полета Django MongoDB MongoEngine

  4. Как ефективно да изпълнявате различни функции с множество клавиши?

  5. Как да проверите дали избраните имейл и име вече съществуват в MongoDB