2017-02-25 2 views
0

Ich habe ein Schema für Conversations in MongoDB erstellt, wo Nachrichten als Array von Objekten in Conversations Object gespeichert werden.MongoDB Subdocument Abfrage Leistung auf große Dataset

Conversation { 
    company_id: { type:ObjectId, index: true }, 
    messages: [{ 
        _id: { type: ObjectId, index: true } 
    }] 
} 

Es gibt eine Abfrage, die ich an der richtigen Stelle, die ein Gespräch auf der Grundlage der company_id und _id der ersten Nachricht in dem Array gesendet nachschlägt (das aus einem anderen Teil der Anwendung gesendet wird).

Conversation.findOne({ company_id: c_id, messages._id: firstMessage }) 

Theoretisch, wenn ein Unternehmen hat 100 Millionen Gespräche, und jede dieser Gespräche hat 1 Million Nachrichten, wie viel von einem Performance-Problem werde ich für die Abfrage des Subdokument haben, anstatt mir die erste Nachricht speichert ID im Hauptdokument und Abfrage nur das Stammobjekt?

Conversation { 
    company_id: { type:ObjectId, index: true }, 
    firstMessage_id: { type:ObjectId, index: true }, 
    messages: [{ 
        _id: { type: ObjectId, index: true } 
    }] 
} 

Conversation.findOne({ company_id: c_id, firstMessage_id: firstMessage }) 

Vielen Dank im Voraus für die Hilfe.

Antwort

0

Wenn Ihre einzelnen Nachrichten 1 Million sind, würde ich sie in einer separaten Sammlung zusammenhalten und das Aggregation Framework $ Lookup in Version 3.4 verwenden, um Ihnen das Ergebnis zu geben. Natürlich würde ich davon ausgehen, dass die richtigen Indizes in beiden Sammlungen vorhanden sind und richtige Filter verwendet werden, um die Firma abzugleichen.

+0

Mario, danke für die Antwort. In Wirklichkeit habe ich Nachrichten als separate Sammlung mit den IDs in der Konversation gespeichert, aber ich war mehr Fragen über die Abfrage Berechnung eines Objekts finden vs Unterobjekt suchen. – Dfranc3373