Nodejs + mongodb: Wie kann man $ ref Felder abfragen?

8

Ich verwende MongoDB mit einem Nodejs-REST-Service, der meine gespeicherten Daten freilegt. Ich habe eine Frage dazu, wie ich meine Daten abfragen kann, die $ ref.

verwenden

Hier ist ein Beispiel für ein Objekt, das einen Verweis auf ein anderes Objekt (Detail) in einer anderen Sammlung enthält:

%Vor%

Mit dem Node.js- und mongodb-Modul mache ich Folgendes:

%Vor%

Tatsächlich mache ich 2 Abfragen und bekomme 2 Objekte. Es ist eine Art "faules Laden" (nicht genau aber fast)

Meine Frage ist einfach: Ist es möglich, den gesamten Objektgraphen in einer Abfrage abzurufen?

Danke

    
Fred Mériot 30.10.2013, 09:21
quelle

5 Antworten

1

Die Antwort von Vladimir ist nicht gültig, da die Methode db.dereference aus der MongoDB Nodejs API gelöscht wurde:

Ссылка

  

Das db-Instanzobjekt wurde vereinfacht. Wir haben die folgenden Methoden entfernt:

     

db.dreference aufgrund von Db-Referenzen, die auf dem Server veraltet sind

    
jvadillo 02.06.2016, 10:53
quelle
4

Nein, das kannst du nicht.

  

Um DBRefs aufzulösen, muss Ihre Anwendung zusätzliche Abfragen ausführen, um die referenzierten Dokumente zurückzugeben. Viele Treiber verfügen über Hilfsmethoden, die die Abfrage für den DBRef automatisch bilden. Die Treiber lösen DBRefs nicht automatisch in Dokumente auf.

Aus den MongoDB-Dokumenten Ссылка .

    
Brett 30.10.2013 09:40
quelle
4

Ist es möglich, das Elternobjekt zusammen mit seiner $ ref mit einer MongoDB-Abfrage abzurufen?

Nein, das ist nicht möglich.  Mongo haben keine innere Unterstützung für Refs, also ist es an Ihrer Anwendung, sie zu füllen (siehe Bretts Antwort ).

Aber ist es möglich, übergeordnetes Objekt mit allen Referenzen mit einem einzigen node.js Befehl abzurufen?

Ja, es ist möglich. Du kannst es mit Mangusten machen. Es hat die Unterstützung der Bevölkerung von Build-ref. Sie müssen Ihr Datenmodell ein wenig ändern, damit es funktioniert, aber es ist genau das, wonach Sie suchen. Natürlich macht Mongoose dieselben MongoDB-Abfragen wie Sie.

    
Leonid Beschastny 30.10.2013 10:16
quelle
1

Nein, sehr wenige Treiber für MongoDb enthalten spezielle Unterstützung für DBRef . Dafür gibt es zwei Gründe:

  1. MongoDb hat keine speziellen Befehle, um den Abruf referenzierter Dokumente zu ermöglichen. Treiber, die Unterstützung hinzufügen, füllen künstlich die resultierenden Objekte.
  2. Je mehr, "Bare Metal" die API, desto weniger Sinn macht es. In der Tat, als. MongoDb-Sammlungen sind schemalos, wenn der NodeJs-Treiber das primäre Dokument mit allen realisierten Referenzen zurückbrachte, wenn der Code dann das Dokument ohne Unterbrechung der Referenzen speicherte, würde dies zu einem eingebetteten Filialdokument führen. Natürlich wäre das ein Durcheinander.

Wenn Ihre Feldwerte nicht variieren, würde ich mich nicht mit einem DBRef -Typ herumärgern und stattdessen den ObjectId direkt speichern. Wie Sie sehen, bietet ein DBRef wirklich keinen Vorteil, außer dass für jede Referenz viel doppelt vorhandener Speicherplatz benötigt wird, da ein reicheres Objekt zusammen mit seinen Typinformationen gespeichert werden muss. In jedem Fall sollten Sie den möglicherweise unnötigen Aufwand berücksichtigen, um eine Zeichenfolge zu speichern, die die Dokumente der referenzierten Sammlung enthält.

Viele Entwickler und MongoDb, Inc. haben eine Objektdokument-Zuordnungsschicht über den vorhandenen Basistreibern hinzugefügt. Eine beliebte Option für MongoDb und Nodejs ist Mongoose. Da der MongoDb-Server die referenzierten Dokumente nicht wirklich kennt, wird die Verantwortung der Referenzen auf den Client übertragen. Da es üblich ist, konsistent eine bestimmte Sammlung von einem bestimmten Dokument zu referenzieren, ermöglicht es Mongoose, die Referenz als ein Schema zu definieren. Mungo ist nicht schemalos.

Wenn Sie akzeptieren, ein Schema zu haben und es zu benutzen, ist Mungo definitiv einen Blick wert. Es kann effizient einen Stapel verwandter Dokumente (aus einer einzelnen Sammlung) aus einer Reihe von Dokumenten abrufen. Es verwendet immer den nativen Treiber, aber es führt Operationen im Allgemeinen äußerst effizient aus und entlastet die komplexeren Anwendungsarchitekturen.

Ich schlage vor, dass Sie sich die populate -Methode ( hier ) ansehen, um zu sehen, wozu sie in der Lage ist tun.

%Vor%

Wenn anstelle von findById , das immer ein einzelnes Dokument zurückgibt, find verwendet wurde, werden mit populate alle zurückgegebenen Dokumente details -Eigenschaft automatisch ausgefüllt. Es ist auch schlau, dass es dieselben referenzierten Dokumente mehrmals anfordern würde.

Wenn Sie Mongoose nicht verwenden, sollten Sie eine Caching-Ebene in Betracht ziehen, um möglichst keine clientseitigen Referenzjoins zu erstellen. Verwenden Sie den Abfrageoperator $in , um so viele Stapel wie möglich zu erstellen.

    
WiredPrairie 30.10.2013 11:13
quelle
1

Ich erreiche das gewünschte Ergebnis mit dem nächsten Beispiel:

%Vor%

Nicht sicher, dass es die beste Lösung ist, aber es ist die einfachste Lösung, die ich gefunden habe.

    
Vladimir Kovpak 06.02.2015 21:47
quelle

Tags und Links