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-Key: 449390

Url: https://administrator.de/contentid/449390

Printed on: April 23, 2024 at 11:04 o'clock

Member: ukulele-7
ukulele-7 May 10, 2019 at 05:11:29 (UTC)
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
Member: Phreak87
Phreak87 May 11, 2019 at 09:41:41 (UTC)
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
Member: Phreak87
Phreak87 May 11, 2019 updated at 18:20:14 (UTC)
Goto Top
Ich versuche es einfach mal mit $facets.
Vielleicht funktioniert ja das
Member: Phreak87
Phreak87 May 16, 2019 at 20:06:13 (UTC)
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" } }]
}}