Wie alle Filialdokumente abgefragt werden

8

Ich beginne mit MongoDb und nodejs (mit Mungo).

Ich habe eine Sammlung von Stories , von denen jeder ein oder mehrere Tags haben kann, etwa so:

%Vor%

Ich möchte jetzt eine Tag-Cloud erstellen .

Es bedeutet Stories für alle Tags abzufragen.

In einer relationalen Welt (z. B. MySQL) hätte ich eine Storys-Tabelle, eine Tags-Tabelle und eine Stories_Tags-Tabelle (Viele-zu-Viele). Dann würde ich nach der Tag-Tabelle oder ähnlichem fragen.

Gibt es einen Weg dazu? (Ich bin sicher, ja)

Wenn ja, ist es eine gute Übung? Oder bricht es das Nosql-Paradigma?

Können Sie sich einen besseren Weg für mein Schemadesign vorstellen?

    
Fabio B. 27.08.2012, 09:26
quelle

4 Antworten

2

Sie können dazu einen MR verwenden. In einem MR würden Sie einfach die Tags auswählen und projizieren:

%Vor%

Und dann würde Ihr Reduce durch die ausgegebenen Dokumente laufen und die Anzahl der Male, die das Tag gesehen wurde, zusammenfassen.

Wenn Sie auf das neueste Unstable 2.2 upgraden, können Sie auch das Aggregation Framework verwenden. Sie würden die $ project- und $ sum-Piplines des Aggregation-Frameworks verwenden, um die Tags aus jedem Post zu projizieren und sie dann zu summieren, um eine Score-basierte Tag-Cloud zu erstellen, mit der Sie den Text jedes Tags basierend auf der Summierung bestimmen können >

  

Wenn ja, ist es eine gute Übung? Oder bricht es das Nosql-Paradigma?

Dies ist ein ziemlich normales Problem in MongoDB und eines, von dem Sie nicht wegkommen werden. Mit der wiederverwendbaren Struktur kommt die unvermeidliche Notwendigkeit, einige komplexe Abfragen darüber zu machen. Glücklicherweise gibt es in 2.2 das Aggregationsframework zum Speichern.

Wenn es sich um einen guten oder einen schlechten Ansatz handelt, ist es ein ziemlich Standard, da es weder gut noch schlecht ist.

Um die Struktur zu verbessern, könnten Sie eindeutige Tags mit ihrer Anzahl vorab zu einer separaten Sammlung aggregieren. Dies würde es einfacher machen, Ihre Tag-Cloud in Echtzeit zu erstellen.

Voraggregation ist eine Form der Erstellung der anderen Sammlung, die Sie normalerweise von einem MR erhalten würden, ohne MRs oder das Aggregationsframework verwenden zu müssen. Normalerweise basiert das Ereignis auf Ihrer App. Wenn also ein Benutzer einen Beitrag erstellt oder einen Beitrag neu verfasst, wird ein Voraggregationsereignis für eine Sammlung von "tag_count" ausgelöst, das wie folgt aussieht:

%Vor%

Wenn das Ereignis ausgelöst wird, durchläuft Ihre App die Tags auf dem Post, indem Sie im Prinzip $ inc upserts ausführt:

%Vor%

Und so haben Sie jetzt eine Sammlung von Tags mit deren Anzahl in Ihrem Blog. Von dort gehen Sie die gleiche Route wie der MR und fragen Sie einfach diese Sammlung Ihre Daten aus. Sie müssten natürlich mit dem Löschen und Aktualisieren von Ereignissen umgehen, aber Sie erhalten die allgemeine Idee.

    
Sammaye 27.08.2012, 11:45
quelle
10

Gehen Sie folgendermaßen vor, indem Sie das Aggregationsframework verwenden (Sie müssen nur Version 2.2 verwenden).

%Vor%

Ihr Ergebnis wird wie folgt aussehen:

%Vor%     
Asya Kamsky 29.08.2012 01:34
quelle
1

Willkommen bei Mongo

Das beste "Schema" für Ihre Daten wird in etwa so aussehen.

Sie erstellen eine Sammlung namens Stories, jede Story wird ein Dokument in dieser Sammlung sein. Sie können dann leicht Ihre Daten mit etwas wie.

abfragen %Vor%

AKTUALISIEREN

%Vor%

Beachten Sie die Punktnotation in der Suchabfrage, so erreichen Sie Arrays / Objekte in Mongo.

    
saeed 27.08.2012 10:32
quelle
0

Nun, es gibt verschiedene Wege. Und ich denke, es gibt keinen Unterschied zwischen Ihrer Lösung und diesem .

Sie können auch die map_reduce-Methode kopieren und einfügen, um einen Hashwert für die Anzahl der Tags auszugeben.

    
Prajna 27.08.2012 10:24
quelle