6

ich das folgende Modell in Mongo db haben:

Benutzer Sammlung

{ 
_id:12345, 
name:15, 
age:"Joe", 
} 

Adressen Sammlung

{ 
_id:7663, 
userId:12345, 
Street:"xyz", 
number:"1235", 
city:"New York", 
state:"NY" 
} 

Jetzt möchte ich Holen Sie sich alle Adressen von Benutzern über dem Alter von 20 Jahren. Was ich dachte, war, alle IDs von Benutzern über 20 abzufragen und mit dem Ergebnis dieser Abfrage den $ in Operator zu verwenden, um die Adressen zu finden.

Meine Frage ist, gibt es eine Möglichkeit, dies in eine Abfrage zu verwandeln? Gibt es eine bessere Möglichkeit, dies abzufragen? (obs: das ist nur ein Beispiel, mit meinem Problem kann ich Adressen in Benutzer nicht einbetten)

+0

Nein, MongoDB unterstützt keine Joins. http://StackOverflow.com/Questions/4067197/Mongodb-and-joins – JohnnyHK

+0

Ja, ich verstehe, dass Mongo db keine Joins unterstützt. Was ich versuche zu verstehen, ist, was ist der beste Weg, um mein Problem zu lösen, wie oben aufgeführt. Gibt es zum Beispiel eine Möglichkeit, alle IDs von Benutzern abzurufen und sie in eine andere Abfrage einzufügen? –

+0

"Die besten Weg" Fragen sind normalerweise nicht gut für SO, aber wenn Sie Ihre Frage aktualisieren, um Ihren Code einzuschließen, der $ in verwendet, um dies zu tun, und Sie eine spezifische Frage über ein Problem mit dem Ansatz haben, dann funktioniert besser. – JohnnyHK

Antwort

0

können Sie dies nur auf der Anwendungsebene tun - das heißt, alle Benutzer in einer Abfrage zu bekommen, alle Adressen in einem anderen, und kleben Sie es zusammen. Mongo tut nicht, was Sie fragen.

5

In Mongo-Shell können Sie das Ergebnis einer Abfrage in einem anderen verwenden. Beispiel:

use database // the name of your database 
db.coll1.find({_id:{$nin:db.coll2.distinct("coll1_id")}}) 

Hier Sammlung coll1 enthält ein _id-Feld. Dann können Sie nach allen IDs suchen, die nicht in coll2s Liste des coll1_id-Feldes sind. Das ist also eine Möglichkeit, zwei Tabellen zu bereinigen, wenn Sie Datensätze in coll1 haben, die keine Referenz über das coll1_id-Feld in coll2 haben.

Ein weiterer Ansatz das gleiche tun:

use database // the name of your database 
temp = db.coll2.distinct("coll1_id"); 
db.coll1.find({_id:{$nin:temp}}) 

Das erste Beispiel tut es in einem Befehl, die zweiten in zwei tut, aber das Konzept ist das gleiche. Ergebnisse von einer Abfrage in einer anderen verwenden. Viele verschiedene Möglichkeiten, dies zu tun. Außerdem kann die Methode .toArray() nützlich sein, um Arrays zu erstellen, wenn Sie mehr tun als distinct().

+1

sehr hilfreich, das spart Schreiben einiger Programme, um ein Waisenhaus Entfernung zu tun. –

+1

Das ist großartig und erspart mir eine Menge Schmerzen für meine gewünschte Funktionalität. Vielen Dank! – MrNorm

0

die Aggregations Rahmen verwenden, wo die $lookup Pipeline-Stufe die Funktionalität der beiden Sammlungen zu verbinden bietet:

db.user.aggregate([ 
    { "$match": { "age": { "$gt": 20 } } }, 
    { 
     "$lookup": { 
      "from": "addresses", 
      "localField": "_id", 
      "foreignField": "userId", 
      "as": "address" 
     } 
    } 
]) 

Die oben wird ein neues Array Feld address genannt erzeugen (wie in der $lookupangegebenen als Option) und dies enthält die passenden Dokumente aus der Sammlung Adressen. Wenn der angegebene Name bereits im Eingabedokument vorhanden ist, wird das vorhandene Feld überschrieben.