2011-11-21 13 views
27

Chcę zaimplementować funkcję "bump" dla tematów. Gdy temat zostanie podważony, pojawi się nowe pole "bump_date". Chcę go posortować tak, że gdy pojawi się pole "bump_date", zostanie ono posortowane tak, jakby było "stworzonym" polem. Oto przykład z moich db.topics:MongoDB sortowanie

{ 
    "text" : "test 1", 
    "created" : "Sun Nov 20 2011 02:03:28 GMT-0800 (PST)" 
}, 
{ 
    "text" : "test 2", 
    "created" : "Sun Nov 18 2011 02:03:28 GMT-0800 (PST)" 
}, 
{ 
    "text" : "test 3", 
    "created" : "Sun Nov 17 2011 02:03:28 GMT-0800 (PST)", 
    "bump_date: : "Sun Nov 19 2011 02:03:28 GMT-0800 (PST)" 
} 

chcę wrócić do sortowania w porządku "test 1", "test 3", "Test 2"

+0

Może to pomóc w sortowaniu MongoDB http://www.code-sample.com/2016/07/mongodb-sort-by-date.html –

Odpowiedz

69

sortowanie odbywa się jak MongoDB tak:

db.collection.find({ ... spec ... }).sort({ key: 1 })

gdzie 1 jest rosnący i -1 jest malejący.

W twoim konkretnym przykładzie: db.topics.find().sort({ bump_date: 1 }), chociaż lepiej byłoby nazwać to "aktualizacją".

Będziesz również chciał umieścić indeks w polu "bump_date".

+2

Aby to działało zgodnie z oczekiwaniami, myślę, że OP będzie musiał ustawić ' bump_date' to 'created' przy zapisywaniu dokumentu po raz pierwszy. Następnie zawsze sortuj według 'bump_date' i indeksuj, tak jak sugerujesz. – dcrosta

+1

To prawda i prawdopodobnie powinno się ją stworzyć, aby kolekcja mogła zostać ostatecznie skompaktowana. Lub [sparse indexes] (http://www.mongodb.org/display/DOCS/Indexes#Indexes-SparseIndexes). –

2

Obecnie nie jest to możliwe w MongoDB zrobić coś w rodzaju na podstawie kryteriów zdefiniowanych przez użytkownika na wielu columns.eg. tutaj funkcja byłby powrót bump_date jeśli jest on ustawiony, jeszcze powrócić created

Albo trzeba będzie użyć po stronie serwera lub kodu po stronie klienta, jak wspomniano tutaj:

Mongo complex sorting?

lub jeśli chcesz pozostać z podstawowego quering i sortowania, to powinien:

  • utworzyć klucz bump_date równoważna created gdy nowy rekord jest tworzony. To będzie kosztować danych, ponieważ można spodziewać się, że każdy temat zostanie napotkany raz na jakiś czas w przyszłości, dlatego w końcu zostanie dodane pole . Dodaj go od samego początku.

  • Zawsze, gdy artykuł zostanie podważony, zaktualizuj pole bump_date.

Twój przykład dokumenty będą wyglądać z tą zmianą:

{ 
    "text" : "test 1", 
    "created" : "Sun Nov 20 2011 02:03:28 GMT-0800 (PST)", 
    "bump_date" : "Sun Nov 20 2011 02:03:28 GMT-0800 (PST)" 
}, 
{ 
    "text" : "test 2", 
    "created" : "Sun Nov 18 2011 02:03:28 GMT-0800 (PST)", 
    "bump_date" : "Sun Nov 18 2011 02:03:28 GMT-0800 (PST)" 
}, 
{ 
    "text" : "test 3", 
    "created" : "Sun Nov 17 2011 02:03:28 GMT-0800 (PST)", 
    "bump_date: : "Sun Nov 19 2011 02:03:28 GMT-0800 (PST)" 
} 

będziecie ensureIndex na polu bump_date. Teraz możesz łatwo wyszukiwać wymagane dane.

db.topics.find().sort({ bump_date: 1 }) 
+0

Dlaczego warto upewnić się, że elementIndex ma zastosowanie do terminu bump_date? –

5

Jak zasugerował Brian Hicks, stworzenie dodatkowego pola updated_at jest drogą do zrobienia. W ten sposób, gdy tworzony jest dokument, możesz mieć utworzone _at i updated_at początkowo są takie same.

{ 
    "created_at": xxx, 
    "updated_at": xxx 
} 

Jeśli następnie „podbić” pole updated_at przez ustawienie go do chwili obecnej, gdy istnieje zdarzenie guz można sortować na polu updated_at do osiągnięcia zamawiania chcesz.

4

również:

db.collection.find({ $query: {}, $orderby: { column : -1 } }) 

gdzie 1 wznosi -1 i opada.

Powiązane problemy