MongoDB
 sql >> Baza danych >  >> NoSQL >> MongoDB

MongoDB Schema Design - Głosowanie na posty

Typowym sposobem śledzenia ogólnej liczby głosów byłoby zachowanie liczby głosów w dokumencie pocztowym i niepodzielne aktualizowanie jej podczas przesyłania nowej wartości do tablicy głosów.

Ponieważ jest to pojedyncza aktualizacja, masz gwarancję, że liczba będzie zgodna z liczbą elementów w tablicy.

Jeśli liczba agregacji jest stała, a witryna jest bardzo zajęta, możesz rozszerzyć ten paradygmat i zwiększyć dodatkowe liczniki, takie jak jeden dla miesiąca, dnia i godziny, ale może to bardzo szybko wymknąć się spod kontroli. Zamiast tego możesz użyć nowego Struktury agregacji (dostępne w wydaniu deweloperskim 2.1.2, będzie w produkcji w wersji 2.2. Jest prostsze w użyciu niż Map/Reduce i pozwoli ci wykonać obliczenia, które chcesz w bardzo prosty sposób, szczególnie jeśli zadbasz o przechowywanie dat głosowania jako Typ ISODate().

Typowy potok dla zapytania agregującego dla najczęściej zbierających głosy w tym miesiącu może wyglądać mniej więcej tak:

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

Ogranicza to wejście do potoku do postów, które mają głosy dopasowując daty głosowania do liczonego miesiąca, "odwija" tablicę, aby uzyskać jeden dokument na głos, a następnie wykonuje równoważne "grupowanie według" sumując wszystkie głosy dla każdego tytułu (Zakładam, że tytuł jest wyjątkowy). Następnie sortuje malejąco według liczby głosów i ogranicza wynik do pierwszych dziesięciu.

Masz również możliwość agregowania głosów według dnia (na przykład) dla danego miesiąca, aby zobaczyć, które dni są najbardziej aktywne w głosowaniu:

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. Radzenie sobie z warunkami wyścigowymi i głodem podczas generowania unikalnych identyfikatorów za pomocą MongoDB + NodeJS

  2. Błąd Mongodb podczas uruchamiania

  3. Laravel 5 wykonuje agregację za pomocą mongodb na klauzuli where

  4. Czy Python może zapisywać do bazy danych i aktualizować Meteor?

  5. Pobierz wartości jako tablicę elementów po $lookup