2017-04-18 6 views
0

Ich habe große Sammlung von Dokumenten in MongoDB mit der folgenden Struktur als Beispiel:Complex MongoDB Sammlungsabfrage mit NodeJS

{ "key" : "a" ,"data" : "value1" , "lastname" : "Doe" }<br> 
{ "key" : "ab" , "data" : "value1" , "lastname" : "Doe" }<br> 
{ "key" : "abc" , "data" : "value1" , "lastname" : "Doe" } <<< <br> 
{ "key" : "d" ,  "data" : "value2" , "lastname" : "Doe" }<br> 
{ "key" : "df" , "data" : "value2" , "lastname" : "Doe" }<br> 
{ "key" : "dfg" , "data" : "value2" , "lastname" : "Doe" } <<< <br> 

Ich muß die Daten aus diesen beiden Linien von <<< markiert bekommen, basierend auf Bedingungen, dass key auf diese Linien enthält bereits Schlüsselwerte aus anderen Dokumenten für die gleiche lastname dh „abc“ hat „ab“ und „ab“ hat „a“, führen musste ich sollte wie folgt aussehen:

{ "lastname" : "Doe" , "value1" : "abc" , "value2" : "dfg" } 

Ich kann Daten in zwei Durchgängen ziehen, indem ich zwei separate Abfragen erstelle, aber ich möchte sehen, ob dies in nur einem einzigen Fall möglich ist.

+0

Mögliche Duplikat [? Wie führe ich die SQL in MongoDB Äquivalent Join] (http://stackoverflow.com/questions/2350495/how-do-i- perform-the-sql-join-äquivalent-in-mongodb) – str

Antwort

0

noch nicht vollständig formatiert:

db.coll.aggregate([ 
{$project: {key:1, root: '$$ROOT', lastname: 1, data: 1, keyLength: {$strLenBytes: '$key'}, keyIndexes: {$range:[0, {$strLenBytes: '$key'}]}}}, 
{$unwind: '$keyIndexes'}, 
{$group: {items: {$push: '$root'}, count: {$sum: 1}, _id: {$substrBytes: ['$key', '$keyIndexes', 1]}}}, 
{$match: {count: 1}}, 
{$group: {_id: '$items.lastname', items: {$push: {$arrayElemAt: ['$items', 0]}}}} 
]).pretty() 
{ 
    "_id" : [ 
     "Doe" 
    ], 
    "items" : [ 
     { 
      "_id" : ObjectId("58f62e5433530ab32f554fd6"), 
      "key" : "abc", 
      "data" : "value1", 
      "lastname" : "Doe" 
     }, 
     { 
      "_id" : ObjectId("58f62e5433530ab32f554fd9"), 
      "key" : "dfg", 
      "data" : "value2", 
      "lastname" : "Doe" 
     } 
    ] 
}