641 Stimmen

Wie führe ich den SQL-Join in MongoDB aus?

Wie führe ich den SQL-Join in MongoDB aus?

Nehmen wir an, Sie haben zwei Sammlungen (Benutzer und Kommentare), und ich möchte alle Kommentare mit pid=444 zusammen mit den Benutzerinformationen für jeden abrufen.

comments
  { uid:12345, pid:444, comment="blah" }
  { uid:12345, pid:888, comment="asdf" }
  { uid:99999, pid:444, comment="qwer" }

users
  { uid:12345, name:"john" }
  { uid:99999, name:"mia"  }

Gibt es eine Möglichkeit, alle Kommentare mit einem bestimmten Feld (z. B. ...find({pid:444}) ) und die mit jedem Kommentar verknüpften Benutzerinformationen in einem Rutsch zu finden?

Im Moment erhalte ich zuerst die Kommentare, die meinen Kriterien entsprechen, dann finde ich alle uid's in diesem Ergebnissatz heraus, erhalte die Benutzerobjekte und führe sie mit den Ergebnissen des Kommentars zusammen. Es scheint, dass ich das falsch mache.

67 Stimmen

Die letzte Antwort auf diese Frage ist wahrscheinlich die wichtigste, da MongoDB 3.2+ eine Join-Lösung namens $lookup implementiert hat. Ich dachte, ich würde sie hier einfügen, weil vielleicht nicht jeder bis zum Ende liest. stackoverflow.com/a/33511166/2593330

10 Stimmen

Richtig, $Nachschlag wurde in MongoDB 3.2 eingeführt. Einzelheiten finden Sie unter docs.mongodb.org/master/reference/operator/aggregation/lookup/

0 Stimmen

Konvertieren Sie eine beliebige Abfrage in Mongo und prüfen Sie die Antwort: stackoverflow.com/questions/68155715/

11voto

Pickels Punkte 32242

Es gibt eine Spezifikation, die von vielen Treibern unterstützt wird und DBRef heißt.

DBRef ist eine formalere Spezifikation für die Erstellung von Referenzen zwischen Dokumenten. DBRefs enthalten (im Allgemeinen) sowohl einen Sammlungsnamen als auch eine Objekt-ID. Die meisten Entwickler verwenden DBRefs nur, wenn sich die Sammlung von einem Dokument zum nächsten ändern kann. Wenn Ihre referenzierte Sammlung immer dieselbe ist, sind die oben beschriebenen manuellen Referenzen effizienter.

Entnommen aus der MongoDB-Dokumentation: Datenmodelle > Datenmodell-Referenz > Datenbank-Referenzen

11voto

Anish Agarwal Punkte 1715

Vor 3.2.6 Mongodb unterstützt keine Join-Abfrage wie mysql. unten Lösung, die für Sie funktioniert.

 db.getCollection('comments').aggregate([
        {$match : {pid : 444}},
        {$lookup: {from: "users",localField: "uid",foreignField: "uid",as: "userData"}},
   ])

3voto

Aouidane Med Amine Punkte 1136

MongoDB erlaubt keine Joins, aber Sie können Plugins verwenden, um dies zu handhaben. Schauen Sie sich das mongo-join-Plugin an. Es ist das beste und ich habe es bereits verwendet. Sie können es mit npm direkt wie folgt installieren npm install mongo-join . Sie können sich die vollständige Dokumentation mit Beispielen .

(++) wirklich hilfreiches Werkzeug, wenn wir (N) Sammlungen verbinden müssen

(--) können wir Bedingungen nur auf die oberste Ebene der Abfrage anwenden

Beispiel

var Join = require('mongo-join').Join, mongodb = require('mongodb'), Db = mongodb.Db, Server = mongodb.Server;
db.open(function (err, Database) {
    Database.collection('Appoint', function (err, Appoints) {

        /* we can put conditions just on the top level */
        Appoints.find({_id_Doctor: id_doctor ,full_date :{ $gte: start_date },
            full_date :{ $lte: end_date }}, function (err, cursor) {
            var join = new Join(Database).on({
                field: '_id_Doctor', // <- field in Appoints document
                to: '_id',         // <- field in User doc. treated as ObjectID automatically.
                from: 'User'  // <- collection name for User doc
            }).on({
                field: '_id_Patient', // <- field in Appoints doc
                to: '_id',         // <- field in User doc. treated as ObjectID automatically.
                from: 'User'  // <- collection name for User doc
            })
            join.toArray(cursor, function (err, joinedDocs) {

                /* do what ever you want here */
                /* you can fetch the table and apply your own conditions */
                .....
                .....
                .....

                resp.status(200);
                resp.json({
                    "status": 200,
                    "message": "success",
                    "Appoints_Range": joinedDocs,

                });
                return resp;

            });

    });

3voto

metdos Punkte 9239

Sie können SQL-Abfragen einschließlich Join auf MongoDB mit mongo_fdw von Postgres.

3voto

Marcelo Lazaroni Punkte 8611

Sie können es mit der Aggregationspipeline tun, aber es ist ein Schmerz, es selbst zu schreiben.

Sie können verwenden mongo-join-query um die Aggregationspipeline automatisch aus Ihrer Abfrage zu erstellen.

So würde Ihre Abfrage aussehen:

const mongoose = require("mongoose");
const joinQuery = require("mongo-join-query");

joinQuery(
    mongoose.models.Comment,
    {
        find: { pid:444 },
        populate: ["uid"]
    },
    (err, res) => (err ? console.log("Error:", err) : console.log("Success:", res.results))
);

Ihr Ergebnis würde das Benutzerobjekt in der Datei uid und Sie können so viele Ebenen verknüpfen, wie Sie möchten. Sie können den Verweis auf den Benutzer einfügen, der auf ein Team verweist, das auf etwas anderes verweist, usw..

Haftungsausschluss : Ich schrieb mongo-join-query um genau dieses Problem zu lösen.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X