2014-02-06 7 views
6

Ich habe den manual references Teil aus der MongoDB Datenbank Referenzen Dokumentation gelesen, aber ich verstehe nicht wirklich den Teil der "zweiten Abfrage, um die referenzierten Felder aufzulösen". Können Sie mir ein Beispiel für diese Abfrage geben, damit ich eine bessere Vorstellung davon bekommen kann, worüber sie sprechen?MongoDB - Handbuch Referenzen Beispiel

"Manuelle Verweise beziehen sich auf die Praxis, das _id-Feld eines Dokuments in ein anderes Dokument einzufügen. Die Anwendung kann dann eine zweite Abfrage ausgeben, um die referenzierten Felder nach Bedarf aufzulösen."

Antwort

7

Die Dokumentation ist ziemlich klar im Handbuch Abschnitt enthält, auf die sich beziehen ist der Abschnitt auf Database References. Der wichtigste Teil dieses in Begreifen wird in der Eröffnungsrede auf der Seite enthalten ist.

„MongoDB unterstützt keine Joins In MongoDB werden einige Daten denormalized oder mit verwandten Daten in Dokumenten gespeichert, um die Notwendigkeit zu entfernen, für Joins In manchen Fällen ist es jedoch sinnvoll, verwandte Informationen in separaten Dokumenten zu speichern, normalerweise in verschiedenen Sammlungen oder Datenbanken. "

Die weiteren Informationen umfasst das Thema, wie Sie könnte wählen mit Zugriff auf Daten, die Sie in einer anderen Sammlung speichern zu beschäftigen.

Es ist die DBRef Spezifikation, die zu sehr ins Detail, ohne dabei, kann in einigen Fahrern so umgesetzt werden, dass, wenn diese in Ihren Dokumenten gefunden werden, werden sie automatisch abrufen (expand) das referenzierte Dokument in die aktuellen Dokument. Dies würde "hinter den Kulissen" mit einer anderen Abfrage zu dieser Sammlung für das Dokument dieser _id implementiert werden.

Im Fall von Manual References bedeutet dies im Grunde genommen, dass es in Ihrem Dokument lediglich ein Feld gibt, das ObjectId aus einem anderen Dokument enthält. Dies unterscheidet sich nur von der DBRef als etwas, das nie durch eine Basis-Treiber-Implementierung verarbeitet werden wird, wie Sie jeden weiteren Abruf dieses anderen Dokuments bis zu Ihnen behandeln.

Im Fall von:

> db.collection.findOne() 

{ 
    _id: <ObjectId>, 
    name: "This", 
    something: "Else", 
    ref: <AnotherObjectId> 
} 

Das ref Feld in dem Dokument ist nichts anderes als eine reine ObjectId und tut nichts Besonderes. Was dies ermöglicht es Ihnen zu tun ist, Ihre eigene Abfrage machen die Objektdetails bezeichnet dies zu erhalten:

> db.othercollection.findOne({ _id: <AnotherObjectId > }) 
{ 
    _id: <ObjectId> 
    name: "That" 
    something: "I am a sub-document to This!" 
} 

Beachten Sie, dass alle diese Prozesse auf der Client-Seite über den Treiber-API. Keines dieser abrufenden anderen Dokumente passiert auf dem Server in jedem Fall.