Ermitteln Sie effizient den Besitzer eines Datensatzes in einer Hierarchie mit MongoDB

9

Ich versuche Folgendes zu erreichen:

  

Wählen Sie alle Datensätze aus, die ich besitze. Eigentümer sind Objekte, die ich erstellt habe ODER Objekte, die ein von mir verwalteter Benutzer erstellt hat, wobei die Benutzerverwaltung in einer Hierarchie von Benutzern verwaltet werden kann

Das Eigentumsrecht ist eindeutig und kann durch eine einfache ID, die dem Eigentümer entspricht, gehandhabt werden. Die Hierarchie der Benutzerverwaltung lässt mich ein wenig ratlos arbeiten, ohne durch große Listen von IDs schwer aufzustehen (Sie können natürlich nur jeden Benutzer finden, der verwaltet wird, und jedes von diesen Benutzern erstellte Objekt mit einer IN-Klausel oder ähnlichem auflisten).

Idealerweise geschieht dies alles in einer einzigen Abfrage, so dass normale Paging- und Bedingungen auftreten können.

Ich dachte, dass es etwas Mathe geben könnte, um es zu schaffen - mit IDs, die irgendwie gehackt werden können, um zu bestimmen, ob sie jemandem in der Befehlskette gehören.

Irgendwelche Hinweise für diese Art von Dingen?

Vermisse ich etwas Offensichtliches?

Verwenden Sie MongoDB, wenn das einen Unterschied macht, aber denken Sie gerne über andere Datenbanken nach.

UPDATE: haben eine MongoDB-Sammlung mit 1.000.000 Datensätzen erstellt, um einige solide Daten darüber zu erhalten, was genau eine verwaltbare Anzahl von Parametern für eine IN-Klausel in einer Abfrage ausmacht. Ich melde mich zurück, wenn ich konkrete Informationen habe.

ANALYSE:

Verwenden Sie den Ruby-Mongo-Treiber und die Ruby-Benchmark-Lib.

MongoDB Collection mit 1039944 Datensätzen

Datensätze sind definiert als:

%Vor%

Mit zufällig generierten Werten für alle Felder.

Das Feld Besitzer hat einen Index.

Ausführen von Abfragen mit den folgenden Bedingungen:

%Vor%

Ergebnisse:

%Vor%

Selbst bei einer Liste von 10k-IDs in der Abfrage ist die Leistung ziemlich bissig.

    
Toby Hede 21.11.2011, 05:22
quelle

1 Antwort

1

Wenn Sie versuchen, Datensätze aus MongoDB basierend auf einer "Spalte" mit einem Wert aus einer Reihe möglicher Werte auszuwählen, die Sie anhand einer Join-Tabelle für eine Benutzerverwaltung ermitteln müssen, arbeitet NoSQL gegen Sie ...

Wenn die Liste der Benutzer-IDs noch verwaltbar ist, können Sie eine where ownerId in (?,?,?,?,?...) -Art der Abfrage ausführen (nachdem Sie die Liste zuerst ermittelt haben):

%Vor%

Der NoSQL-Weg ist wahrscheinlich, Dinge zu denormalisieren, zum Beispiel, indem nicht nur die ownerId in das Dokument aufgenommen wird, sondern der vollständige Pfad in der Verwaltungshierarchie:

%Vor%

Natürlich muss das aktualisiert werden, wenn die Benutzerhierarchie verschoben wird.

    
Thilo 21.11.2011 05:31
quelle