/ / mongoid: Alle eingebetteten Dokumente zurückgeben - Ruby, Mongodb, Mongoid

mongoid: Alle eingebetteten Dokumente werden zurückgegeben - ruby, mongodb, mongoid

Was ist der effizienteste Weg, um alle eingebetteten Dokumente zurückzugeben?

Angenommen, ein Benutzer hat viele Adressen eingebettet ... in ActiveRecord könnte ich sie mit Address.count zählen. Was ist die eingebettete Dokument- / Mongo-Version davon?

Wie wäre es, wenn es 2 oder mehr Ebenen tief ist? Produkt> Drücken> Variationen ... Wie kann ich alle Kapitel aller Bücher und Autoren zählen? Wie würde es sich vergleichen lassen, wenn man alles in Ruby macht?

Product has_many Pressings
Pressing has_many Variations

Product
def self.pressings
all.collect { |p| p.pressings }.flatten
end
def self.variations
self.pressings.collect { |p| p.variations }.flatten
end
end

Antworten:

4 für die Antwort № 1

Wie @maga sagt, ist Map / Reduce für die Echtzeitaggregation zu langsam und das Speichern eines Zählfelds ist der beste Weg.

Eine andere Möglichkeit besteht darin, das gesamte Dokument (oder bestimmte Felder) an Ihre Anwendung zurückzugeben und dort analysieren zu lassen. Dies ist möglicherweise am besten, wenn Sie nicht wissen, wie viele verschachtelte Ebenen vorhanden sein werden.

Ungeachtet dessen, was manche Leute denken, gibt esabsolut kein Schaden dabei. Ihr Datenbankserver wird dieses Dokument gerne sehr schnell zurücksenden und Ihrer Anwendung die Nachbearbeitung ermöglichen.

In Bezug auf die Skalierbarkeit bedeutet dieser Ansatz, dass Sie Ihre Anwendungsserver (die normalerweise viel günstiger sind) anstelle Ihrer Datenbankserver (die normalerweise teurer sind) skalieren.


5 für die Antwort № 2

Normalerweise wird es von gemacht Anhäufung Funktionen (einschließlich Karte verkleinern für spezifischere Situationen), aber sie sind relativ langsam und nicht für die Echtzeitanwendung in schweren Anwendungen geeignet. Wenn die Leistung ein Problem darstellt, schlage ich zusätzliche Nummernfelder vor, die von aktualisiert werden atomare Operationen wenn Änderungen auftreten und von Zeit zu Zeit durch Aggregationsfunktionen geändert werden.


2 für die Antwort № 3

Karte verkleinern in MongoDB ist nützlich für die Stapelverarbeitung von Daten und Aggregationsvorgängen.