2010-02-28 7 views
8

Ist es möglich, eine Abfrage durchzuführen und die eingebetteten Dokumente zurückzugeben?Zurückgeben eingebetteter Dokumente in Abfrage

Derzeit habe ich:

class Post 
    include MongoMapper::Document 

    many :comments 
end 

class Comment 
    include MongoMapper::EmbeddedDocument 

    belongs_to :post 

    key :author 
    key :date 
    key :body 
end 

Hier ist eine Abfrage, die fast da ist:

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

Diese alle Post-Objekte angezeigt werden können, nicht aber die Kommentare. Ich denke, ich könnte etwas tun wie:

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

Aber dies würde alle Kommentare aus den Beiträgen zurückgeben. Ich möchte alle Kommentare erhalten, die diese Bedingung erfüllen. Vielleicht sollte Comment nicht eingebettet werden.

Antwort

5

Ich nehme an, du suchst alle Kommentare neuer als vor drei Tagen? Da Ihre Kommentare nur eingebettete Dokumente sind, existieren sie nicht ohne das Post-Objekt, so dass es keine Möglichkeit gibt, sie separat "abzufragen" (dies ist tatsächlich ein future feature of MongoDB). Sie können jedoch leicht Sie hinzufügen, um eine bequeme Methode zu helfen:

class Comment 
    include MongoMapper::EmbeddedDocument 

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

Diese Methode würden Sie alle Kommentare erhalten, die in den letzten drei Tagen wurden aktualisiert, aber sie würden nicht ganz in Ordnung sein. Eine bessere Lösung könnte sein Karte verwenden/Reduzieren Sie die neuesten Kommentare zu ziehen:

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 

Caveat: Die oben ist völlig ungetestet Code und existiert nur als ein Beispiel, aber theoretisch sollte alle Kommentare aus den letzten drei Tagen zurückkehren sortiert in absteigender Reihenfolge.

+0

Denken Sie, es wäre besser, die Kommentare in ihre eigene Sammlung zu setzen? – vrish88

+2

Ehrlich, es hängt vom Fokus deiner App ab. Wenn es in deiner App hauptsächlich um Kommentare geht, vielleicht. Es gibt jedoch auch andere Lösungen, die berücksichtigt werden müssen. Sie könnten beispielsweise eine de-normierte Capped-Sammlung namens "Kommentare" erstellen, die einfach die letzten, oh, 100 oder so Kommentare in einer separaten Sammlung speichert. Dann könnten Sie diesen Feed bei Bedarf anzeigen, aber ansonsten den Post-Feed anzeigen. NoSQL-Systeme fördern das Experimentieren mit Datendesign, finden Sie heraus, was für Sie am besten funktioniert! –

Verwandte Themen