Wie Abfragen alle Filialdokumente
Ich bin Anfang mit MongoDb und nodejs (mit Mungo).
Habe ich eine Sammlung von Geschichten, jeder von Ihnen kann eine oder mehrere Tags, es ist etwas wie das:
{
title: "The red fox",
content: "The red fox jumps away...",
tags: [
{
tagname: "fairytale",
user: "pippo"
},
{
tagname: "funny",
user: "pluto"
},
{
tagname: "fox",
user: "paperino"
}
]
},
... other stories
Nun möchte ich ein tag-cloud.
Bedeutet es, Abfragen Geschichten für alle tags.
In einer relationalen Welt (z.B. MySQL) würde ich eine Geschichten-Tabelle, einer Tags-Tabelle und eine Stories_Tags Tabelle (viele-zu-viele). Dann würde ich eine Abfrage auf die tags-Tabelle oder sowas.
Gibt es eine Möglichkeit, dies zu tun? (Ich bin sicher, dass ja)
Wenn ja, ist es eine gute Praxis? Oder hat es brechen Sie das nosql-Paradigma?
Können Sie sich vorstellen, einen besseren Weg für mein "schema-design"?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Können Sie einen HERR, dies zu erreichen. In ein MR-würden Sie einfach wählen Sie die tags auf und projizieren Sie:
Werden und dann die reduzieren würde führen Sie durch die ausgegebenen Dokumente, die im Grunde fasst der Höhe der Zeit, der tag war zu sehen.
Wenn Sie ein upgrade auf die neueste unstable 2.2 Sie können auch die aggregation framework. Verwenden Sie die $ - Projekt, und $Summe pipline der aggregation framework Projekt die tags aus jedem post und dann addieren Sie bis zum erstellen einer score-basierten tag-cloud so dass Sie die Größe der text, der jeden tag auf der Grundlage der Summierung.
Dies ist ein ziemlich standard-problem in MongoDB und Sie werden nicht entfliehen. Mit den wiederverwendbaren Struktur kommt die unvermeidliche Notwendigkeit zu tun, einige komplexe Abfragen über es. Glücklicherweise ist in den 2.2 gibt es die aggregationm Rahmen zu speichern.
Ob dies ein gutes oder schlechtes Konzept, es ist ein ziemlich standard als solche ist weder gut oder schlecht.
Wie bei der Struktur besser, man könnte pre-Aggregat einzigartig-tags mit Ihren Grafen zu einer getrennten Sammlung. Das würde es leichter machen, bauen Sie Ihren tag-cloud in Echtzeit.
Pre-aggregation ist eine form schaffen, die eine andere Sammlung, die Sie normalerweise von einem HERRN, ohne die Notwendigkeit der Nutzung der MRs oder der aggregation framework. Es ist normalerweise Ereignis beruhen, auf Ihre app, so dass, wenn ein Benutzer einen Beitrag erstellen oder retags einen Beitrag löst eine pre-aggregation-Veranstaltung eine Sammlung von "tag_count" das sieht aus wie:
Wenn das Ereignis ausgelöst wird Ihre app wird in einer Schleife durch die tags auf der post im Grunde tun $inc upserts etwa so:
Werden und Sie haben nun eine Auflistung der tags, die mit Ihrer Zählung während Ihrem blog. Von dort gehen Sie den gleichen Weg wie der HERR getan hat und Abfrage dieser Kollektion zu bekommen, aus Ihren Daten. Sie würden natürlich behandeln müssen, Lösch-und update-Ereignisse, aber Sie bekommen die Allgemeine Idee.
ensureIndex({ 'tagname': 1 }, {unique: 1})
aber ich habe festgestellt, dass es in der Regel besser, um sicherzustellen, Einzigartigkeit durch Atomare updates durch, um eine zukünftige Erweiterung auf die meisten Funktionen.find()
. Die distinct-Funktion können Sie einen index verwenden, aber immer noch zu prüfen, alle die passenden Schlüssel für die Kriterien gegeben. Zu einer optimalen Daten-Modell könnte zu vermeiden, die Notwendigkeit für Aggregate wie distinct oder Graf, ob diese gängige Anwendungsfälle. Ich denke, dass "notorisch langsam" ist eher "notorisch missverstanden". Inspektion einer Menge von Schlüsseln (oder noch schlimmer, Dokumente!) ist immer langsamer als ein paar.Hier ist, wie Sie dies tun, indem Sie die aggregation framework (Sie müssen nur freigegeben 2.2).
Ihr Ergebnis wie folgt Aussehen:
Willkommen zu Mongo
Die besten "Schema" für Ihre Daten wird so etwas wie dieses.
Erstellen Sie eine Sammlung der sogenannten Geschichten, jede Geschichte wird ein Dokument in dieser Sammlung.
Sie können dann einfach Abfragen Ihre Daten mit so etwas wie.
UPDATE
Beachten Sie die Punkt-notation in die Suche-Abfrage, das ist, wie Sie bis in die arrays/Objekte in mongo.
db.stories.find({ "tags.tagname": { $exists : true }, {"title": 0, content: 0 }})
Aber Sie müssen, um die Anzahl der Geschichten, die über diese tags. Sie können eine Funktion namens zugeordnet,-reduzieren, wenn Sie diesem tutorial Folgen: cookbook.mongodb.org/patterns/count_tags$inc
(Zunahme) von den Indikatoren und oder fügen Sie ein neues tagGut, gibt es verschiedene Möglichkeiten. Und ich glaube, es gibt keinen Unterschied zwischen Ihrer Lösung und diese eine.
Und auch Sie können kopieren&fügen Sie Ihre map_reduce Methode zur Ausgabe der tag-count-hash.