2011-09-23 14 views
8

Pobrałem liczbę identyfikatorów przez MapReduce. Posortowałem te identyfikatory według pewnych kryteriów i teraz potrzebuję uzyskać te obiekty w tej konkretnej kolejności:Mongoid: znajdź poprzez tablicę identyfikatorów

MyModel.find(ids) 

Dobrze? Ale zwraca obiekty nie w kolejności ids są przechowywane. Wygląda na to, że jest on taki sam, jak ten, który nie będzie zwracał pobranych obiektów w tej samej kolejności co zapisane identyfikatory.

Teraz mogę to zrobić

ids.map{|id| MyModel.find(id)} 

który będzie wykonać zadanie, ale będzie wbić się baza danych, wiele razy.

Odpowiedz

9

Możesz zamówić zamówienie ręcznie po tym, jak masz wszystkie swoje przedmioty. Coś takiego:

ordering = { } 
ids.each_with_index { |id, i| ordering[id] = i } 
objs = MyModel.find(ids).sort_by { |o| ordering[o.id] } 
+1

czy jest to szybsze niż pobieranie każdego elementu z db? – fl00r

+0

@ fl00r: Powinien być, tylko jeden MongoDB dostęp do pobierania modeli i prostego sortowania (z wbudowaną transformacją Schwartzian), aby uzyskać rzeczy w pożądanej kolejności. Dostęp do bazy danych jest zazwyczaj drogą częścią. Spróbuj przeprowadzić analizę porównawczą, trudno jest zagwarantować wszystko bez dostępu do prawdziwych danych. –

+0

@muistooshort, mam do czynienia z podobnym problemem. Ogólnie jest prawdą, że lepiej byłoby zminimalizować liczbę odwiedzin baz danych? –

10

pracuje nad podobnym problemem i okazało się nieco bardziej zwięzłe rozwiązanie:

objs = MyModel.find(ids).sort_by{|m| ids.index(m.id) } 

zasadzie tylko przy użyciu bloku sortowania do pniaka indeks elementu.