2010-02-28 17 views
8

Czy można wykonać zapytanie i zwrócić osadzone dokumenty?Zwróć dokumenty osadzone w zapytaniu

Obecnie mam:

class Post 
    include MongoMapper::Document 

    many :comments 
end 

class Comment 
    include MongoMapper::EmbeddedDocument 

    belongs_to :post 

    key :author 
    key :date 
    key :body 
end 

Oto zapytanie, które jest prawie tam:

Post.all("comments.date" => {"$gt" => 3.days.ago}) 

ta zwróci wszystkie obiekty post, ale nie w komentarzach. Chyba mógłbym zrobić coś takiego:

Post.all("comments.date" => {"$gt" => 3.days.ago}).map(&:comments) 

Ale to by zwróciło wszystkie komentarze ze stanowisk. Chciałbym uzyskać wszystkie komentarze, które spełniły ten warunek. Być może Comment nie powinien być osadzony.

Odpowiedz

5

Zakładam, że szukasz wszystkich komentarzy nowszych niż trzy dni temu? Ponieważ Twoje komentarze są po prostu osadzonymi dokumentami, nie istnieją one bez obiektu Post, więc nie ma sposobu na "zapytanie" je osobno (w rzeczywistości jest to future feature of MongoDB). Jednakże, można łatwo dodać metodę wygody pomóc:

class Comment 
    include MongoMapper::EmbeddedDocument 

    def self.latest 
    Post.all(:conditions => {"comments.date" => {"$gt" => 3.days.ago}}).map{|p| p.comments}.flatten 
    end 
end 

ten sposób można dostać wszystkie komentarze, które zostały zaktualizowane w ciągu ostatnich trzech dni, ale nie byłoby całkowicie w porządku. Lepszym rozwiązaniem może być użycie Map/Reduce pociągnąć najnowsze komentarze:

class Comment 
    include MongoMapper::EmbeddedDocument 

    def self.latest 
    map = <<-JS 
    function(){ 
     this.comments.forEach(function(comment) { 
     emit(comment.created_at, comment) 
     }); 
    } 
    JS 
    r = "function(k,vals){return 1;}" 
    q = {'comments.created_at' => {'$gt' => 3.days.ago}} 

    Post.collection.map_reduce(m,r,:query => q).sort([['$natural',-1]]) 
    end 
end 

Zastrzeżenie: powyższe jest kod całkowicie niesprawdzone i po prostu istnieje, jako przykład, ale teoretycznie powinien zwrócić wszystkie komentarze z ostatnich trzech dni posortowanych w kolejności malejącej.

+0

Czy uważasz, że lepiej byłoby umieścić komentarze we własnej kolekcji? – vrish88

+2

Szczerze mówiąc, zależy to od centrum Twojej aplikacji. Jeśli Twoja aplikacja dotyczy głównie komentowania, być może. Istnieją jednak również inne rozwiązania, które należy rozważyć. Na przykład możesz stworzyć demodulowaną kolekcję z ograniczeniami o nazwie "komentarze", która po prostu zapisuje ostatnie, około 100 komentarzy w osobnej kolekcji. Następnie możesz wyświetlać ten kanał, gdy jest to konieczne, ale w przeciwnym razie wyświetlać treść wiadomości. Systemy NoSQL zachęcają do eksperymentowania w projektowaniu danych, znajdowania najlepszych rozwiązań dla Ciebie! –

Powiązane problemy