phreak87
Goto Top

MongoDb distinct all

Hallo,

Ich bin auf der suche nach einer schnellen Methode um in einer MongoDb alle Cols in einem distinct abzufragen.

Angenommen ich habe:

ColA: A, ColB: B,Col..
ColA: A, ColB: C,Col..
ColA: C, ColB: A,Col..

Für distinct(ColA) erhalte ich A,C
Für distinct (ColB) erhalte ich A,B,C
... Je Col 1 distinct ...

Was jedoch mit gleichem query jedesmal zb.: 15000 Datensätze durchsucht.

Gibt es eine Möglichkeit in einer Abfrage alle Resultate zu sammeln und dann ein distinct je Col anzuwenden?
Ein normales distinct auf mehrere Col würde alle Kombinationen aller Cols beinhalten, was nicht dem gleichen Resultat entsprechen würde.

zB.:

ColA: (A,B),
ColB (A,B,C)

Content-ID: 449390

Url: https://administrator.de/forum/mongodb-distinct-all-449390.html

Ausgedruckt am: 22.12.2024 um 09:12 Uhr

ukulele-7
ukulele-7 10.05.2019 um 07:11:29 Uhr
Goto Top
Also zunächst macht ein DISTINCT ja nichts anderes als ein GROUP BY und wenn mehrere Spalten im DISTINCT oder GROUP BY stehen behlaten die natürlich auch ihren "Zusammenhang", das heißt die drei Ausgangsdatensätze sind schon eindeutig und lassen sich nicht sinnvoll weiter gruppieren.

Dein Beispiel zeigt ein ganz anderes Ausgabeformat, dort werden ja die Werte aus einer Spalte zu einer Zeile. Nun bin ich kein kenner von MongoDB aber mit einem Select pro Spalte, einem STRING_AGG() für die Werte und einem UNION ALL müsste das gehen. Ich probiers mal in pseudo Code:
SELECT STRING_AGG(DISTINCT ColA) FROM tabelle UNION ALL SELECT STRING_AGG(DISTINCT ColB) FROM tabelle
Phreak87
Phreak87 11.05.2019 um 11:41:41 Uhr
Goto Top
Das Ausgabeformat ist mir egal, wenn ich daraus die Gruppen ohne Zusammenhang ausleiten kann.
Im Endeffekt sollte es ein "select query Into .." mit anschließendem distinct je Spalte sein.
Bei dem regulären vorgehen wären das je distinct 1 query mit gleichen Resultaten, was schlecht für die Performance ist. Es sei denn die MongoDb hat einen internen Cache für gleiche querys
Phreak87
Phreak87 11.05.2019 aktualisiert um 20:20:14 Uhr
Goto Top
Ich versuche es einfach mal mit $facets.
Vielleicht funktioniert ja das
Phreak87
Phreak87 16.05.2019 um 22:06:13 Uhr
Goto Top
Lösung:

Collection.Aggregate:

Der Query (Alle Dokumente):

{ "$match" :
{ "_id" : { "$exists" : true } }
}

Die Facets:

{ "$facet" : {
"ValA" : [{ "$group" : { "_id" : "$ValA"}}],
"ValB" : [{ "$group" : { "_id" : "$ValB" } }],
"ValC" : [{ "$group" : { "_id" : "$ValC" } }]
}}