einbetten vs Link auf große mongoDB Sets (Rubin)
-
29-09-2019 - |
Frage
Embedded vs Link
Ich bin auf der Suche nach dem schnellsten Weg, um ein Newsletter Dokument für eine angeschlossene E-Mail zu suchen. Bisher habe ich MongoMapper mit einem Dokument für Newsletter und eine andere für E-Mail verwendet. Dies ist immer sehr langsam mit + 100k E-Mail.
Ich dachte, vielleicht ist es schneller einzubetten die E-Mails in einem Array innerhalb Newsletter da ich wirklich nur bin interessiert an der E-Mail ( ‚someemail@email.com‘) und keine Logik um ihn herum.
1) Ist es möglich, überhaupt einbetten, so viel wie 100k-500k E-Mails in einem Dokument? 2) Ist Mongoid besser / schneller für das?
Ich füge die E-Mail, wenn es nicht bereits in der Sammlung ist mit der Frage
email = newsletter.emails.first(:email => 'someemail@email.com')
unless email
email = Email.new(:email => 'someemail@email.com', :newsletter_id => self.id)
email.save
end
Und ich denke, das ist alles beginnt zu schmerzen, wo.
Hier ist, wie sie miteinander verbunden sind Klasse Newsletter umfassen MongoMapper :: Document viele: E-Mails ... Ende
Class Email
include MongoMapper::Document
key :email, String
key :newsletter_id, ObjectId
belongs_to :newsletter
end
wäre für jede Hilfe zu diesem Thema Liebe:)
Lösung
Es gibt eine maximale Dokumentgröße von 16 MB zur Zeit für MongoDB, MongoMapper oder Mongoid keinen Unterschied leisten.
finden Sie unter http://www.mongodb.org/display/DOCS/Documents
Eingebettete Dokumente sollten jedoch wesentlich schneller sein, wenn Sie alle E-Mails passen innerhalb der Grenze ein Squeeze sein könnte.
Wenn die gesamte E-Mail-Speicherung zu viel ist, warum speichern nicht nur entweder ein Array oder eingebettet nur die E-Mails richten Sie den Newsletter mit einem Verweis auf die vollständige E-Mail withing.
Sie können dann den Geschwindigkeitsvorteil erhalten Sie wollen, und halten Sie die E-Mails zugänglich außerhalb des Newsletters.