mongodb php - wie "INNER JOIN" -ähnliche Abfrage zu tun

8

Ich benutze die Mongo PHP Erweiterung.

Meine Daten sehen folgendermaßen aus:

%Vor%

Wie führe ich eine ähnliche Abfrage von PHP aus?

%Vor%     
persten 30.09.2010, 10:18
quelle

5 Antworten

18

MongoDB unterstützt keine Joins. Wenn Sie die Nachrichten den Benutzern zuordnen möchten, können Sie Folgendes tun:

1) Tun Sie dies auf der Anwendungsebene. Holen Sie sich die Liste der Benutzer, und holen Sie sich die Liste der Nachrichten und ordnen Sie sie in Ihrer Anwendung zu. Diese Methode ist sehr teuer, wenn Sie dies oft benötigen.

2) Wenn Sie den vorherigen Schritt häufig ausführen müssen, sollten Sie Ihr Schema so umgestalten, dass die Nachrichtenartikel zusammen mit den Benutzerdokumenten als eingebettete Dokumente gespeichert werden.

%Vor%

Sobald Sie Ihre Daten in diesem Format haben, ist die Abfrage, die Sie ausführen möchten, implizit. Es ist jedoch zu beachten, dass Analyseabfragen in einem solchen Schema schwierig werden. Sie müssen MapReduce verwenden, um die zuletzt hinzugefügten Nachrichtenartikel und solche Abfragen abzurufen.

Am Ende hängen der Schemadesign und die Denormalisierung Ihrer Anwendung davon ab, welche Art von Abfragen von Ihrer Anwendung erwartet werden.

Sie können diese Links nützlich finden. Ссылка http://www.blip.tv/file/3704083

Ich hoffe, das war hilfreich.

    
srivani 01.10.2010 01:38
quelle
14

Vergessen Sie Joins.

Machen Sie einen Fund in Ihren Nachrichten. Übernehmen Sie die Überspringungsnummer und den Grenzwert für das Auslagern der Ergebnisse.

%Vor%

Dann durchlaufen Sie die Sammlung und greifen Sie auf die user_id. In diesem Beispiel wären Sie auf 10 Elemente beschränkt. Führen Sie nun eine Abfrage nach Benutzern für die gefundenen Benutzer-ID-Elemente durch.

%Vor%

Wenn Sie die Nachrichten ausdrucken, können Benutzerinformationen aus der Benutzersammlung basierend auf der Benutzer-ID angezeigt werden.

Sie haben 2 Anfragen an die Datenbank gestellt. Keine Unordnung mit Joins und Herausfinden von Feldnamen usw. EINFACH !!!

    
Richard Torcato 16.07.2012 19:40
quelle
4

Sie könnten besser die "Nachrichten" in die Dokumente der Benutzer einbetten.

    
luckytaxi 30.09.2010 14:33
quelle
4

Wenn Sie die neue Version von MongoDB (3.2) verwenden, erhalten Sie mit dem $lookup -Operator, der mit einem linken äußeren Join in SQL verglichen werden kann.

Die Nachteile bei der Verwendung dieses Operators sind, dass er sehr ineffizient ist, wenn er über große Ergebnismengen ausgeführt wird, und er unterstützt nur die Gleichheit für die Übereinstimmung, bei der die Gleichheit zwischen einem einzelnen Schlüssel aus jeder Sammlung bestehen muss. Die andere Einschränkung ist, dass die Right-Collection eine nicht erschöpfte Sammlung in derselben Datenbank wie die Linke-Sammlung sein sollte.

Die folgende Aggregationsoperation für die news -Kollektion verknüpft die Dokumente von news mit den Dokumenten aus der users -Kollektion, indem die Felder user_id aus der news -Kollektion und %%_Co_de% aus% verwendet werden. co_de% sammlung:

%Vor%

Die äquivalente PHP-Beispielimplementierung:

%Vor%     
chridam 14.01.2016 15:00
quelle
0

Das geht nicht in mongoDB. Und seit Version 3 ist Eval () veraltet, also sollten Sie auch keine gespeicherten Prozeduren verwenden.

Der einzige Weg, den ich kenne, um eine serverseitige Abfrage mit mehreren Sammlungen zu erreichen, ist die Verwendung von Node.js oder ähnlichem. Aber wenn Sie diese Methode ausprobieren, empfehle ich Ihnen dringend, die IP-Adressen, die auf Ihren Rechner zugreifen dürfen, aus Sicherheitsgründen zu beschränken.

Wenn Ihre Sammlungen nicht zu groß sind, können Sie innere Verbindungen vermeiden, die sie denormalisieren.

    
Adrian Lopez 04.09.2015 14:21
quelle

Tags und Links