2016-10-19 2 views
0
von Sammlungen in Mongo JOIN zu simulieren

So habe ich Sammlungen projects das Feld contacts.envCon.$id hat:

{ 
    "_id" : ObjectId("5807966090c01f4174cb1714"), 
    "name" : "Terracon" 
} 
:

 { 
     "contacts" : { 
      ... 
      "envCon" : { 
       "$ref" : "contacts", 
       "$id" : ObjectId("5807966090c01f4174cb1714") <---- NOTICE!!! 
      } 
      ... 
     } 
    } 

Auf contacts Sammlung Objekt mit der ID Example12345 wie folgt aussieht

So versuchte ich die folgende $ lookup von Aggregation Framework:

db.getCollection('projects').aggregate([ 
    { 
      $lookup:{ 
        from: "contacts", 
        localField: "contacts.envCon.id", 
        foreignField: "id", 
        as: "example" 
      } 
    } 
]); 

Aber es tut nicht die JOIN was fehlt mir? wie Suchen zwischen 2 Sammlungen mit contacts.envCon.id von Projekten und _id von Kontakten.

Ich benutze Meteor nur für den Fall.

Antwort

0

Ich bin nicht sicher, was mit Ihren ObjectId-Werten vorgeht; Ich kann nicht einmal einen Feldwert von ObjectId ("Example12345") einfügen. Der Unterschied zwischen den ObjectID-Werten zwischen den beiden Sammlungen ist wahrscheinlich der Grund dafür, dass die $ lookup-Suche fehlschlägt.

Die von Ihnen angegebene Aggregationsabfrage funktioniert in meiner Umgebung, wenn ich MongoDB den Wert _id ObjectID in "Kontakte" generieren lasse und denselben Wert in der Sammlung "projects" abspeichern möchte.

$ db.projects.find().pretty() 
{ 
    "_id" : ObjectId("580832011b3c40dba2ae6e32"), 
    "contacts" : { 
     "envCon" : DBRef("contacts", ObjectId("580831d61b3c40dba2ae6e31")) 
    } 
} 

$ db.contacts.find().pretty() 
{ "_id" : ObjectId("580831d61b3c40dba2ae6e31"), "name" : "Terracon" } 


$ db.getCollection("projects").aggregate([ { "$lookup" : {  "from" : "contacts",  "localField" : "contacts.envCon.id",  "foreignField" : "id",  "as" : "example" } } ]).pretty() 
{ 
    "_id" : ObjectId("580832011b3c40dba2ae6e32"), 
    "contacts" : { 
     "envCon" : DBRef("contacts", ObjectId("580831d61b3c40dba2ae6e31")) 
    }, 
    "example" : [ 
     { 
      "_id" : ObjectId("580831d61b3c40dba2ae6e31"), 
      "name" : "Terracon" 
     } 
    ] 
} 
+0

Sein Objekt _ids sind mongodb native _ids, nicht Meteor generiert. –

+0

die IDs sind nur Beispiele Ich wollte nicht die ganze lond ID kopieren, nur ein Beispiel, um es lesbarer zu machen, ich bearbeite es, um es in beide echten IDs aufzunehmen. – commonSenseCode

+0

Ich habe meine Antwort aktualisiert, um anzuzeigen, dass die Aggregation funktioniert. Wie verhält sich die Aggregation in diesem Beispiel in Ihrer Umgebung? –