2017-01-24 6 views
0

Ich habe ein Projekt geerbt, das viele Daten auf einem MongoDB-Server enthält. Ich schreibe ein paar Fragen dazu und bin auf ein ziemlich nerviges Problem gestoßen. Ich muss die Anzahl der eindeutigen Werte finden, die wir ID nennen. Das Problem ist, dass sie je nach Herkunft dieser Daten in zwei verschiedenen Punkten auftreten können.MongoDB: Abrufen eindeutiger Anzahl aus zwei verschiedenen Tabellen

Zum Beispiel könnte die Tabelle wie folgt aussehen:

{ 
    foo: { 
    ID: "ABC123" 
    }, 
    bar: { 
    ID: undefined 
    } 
} 

oder

{ 
    foo: { 
    ID: undefined 
    }, 
    bar: { 
    ID: "ABC123" 
    } 
} 

oder

{ 
    foo: { 
    ID: "ABC123" 
    }, 
    bar: { 
    ID: "ABC123" 
    } 
} 

Leider kann ich nicht wieder Modell die Daten an diese Punkt. Ich habe ein ziemlich begrenztes Wissen über MongoDB. Ich frage mich, ob es eine Möglichkeit gibt, Aggregation zu verwenden, um diese zusammen zu verbinden, damit ich alle IDs in einem einzigen Dokument habe, so dass sie alle einzigartig sind. Es ist ziemlich trivial, das eine oder das andere zu gruppieren, aber das Gruppieren von beiden wird mir Duplikate geben.

Antwort

5

Sie können $project dann $group und dann $addToSet verwenden.

db.c.aggregate([ 
{ 
    $project : { 
     _id : 0, 
     IDS : ["$foo.ID", "$bar.ID"] 
    } 
}, 
{ 
    $unwind : "$IDS" 
}, 
{ 
    $group : { 
     _id : 1, 
     distinctIds : { 
      $addToSet : "$IDS" 
     } 
    } 
} 
]) 
2

Sie können $group versuchen ID's in jedem bar und foo doc in ein Array zu erhalten und sie durch $setUnion laufen verschieden zu vermitteln zuvor ID's gruppiert.

db.collection.aggregate({ 
    $group: { 
     "_id": null, 
     "ID": { 
      $addToSet: { 
       "foo_id": "$foo.ID", 
       "bar_id": "$bar.ID" 
      } 
     } 
    } 
}, { 
    $project: { 
     "ID": { 
      $setUnion: ["$ID.foo_id", "$ID.bar_id"] 
     }, 
     _id: 0 
    } 
}) 
+0

Das funktioniert auch. Vielen Dank. – DeeV

Verwandte Themen