Frage

Was sind die besten Praktiken, um verschachtelte Sets (wie Bäume von Kommentaren) in MongoDB zu speichern?

Ich meine, jeder Kommentar kann einen übergeordneten Kommentar und Kinderkompetenz (Antworten) erhalten.

Sie so speichern:

{
   title: "Hello",
   body: "Please comment me!",
   comments: [
        {
            author: "Peter",
            text: "Hi there",
            answers: [
                  {
                      author: "Peter",
                      text: "Hi there",
                      answers: [
                                 { author: "Ivan", text: "Hi there" },
                                 { author: "Nicholas", text: "Hi there" }
                      ]
                  },
                  { author: "Ivan", text: "Hi there" },
                  { author: "Nicholas", text: "Hi there" },
            ]
        },
        { author: "Ivan", text: "Hi there" },
        { author: "Nicholas", text: "Hi there" },
   ]
}

ist nicht cool, denn wir können beispielsweise nicht nach "alle Posts, die von Peter kommentiert werden" ohne Karte/Reduzierung nicht verlangen.

War es hilfreich?

Lösung

Ich denke, es gibt keine perfekte Lösung - hängt davon ab, welche Vorgänge für Ihre App wichtiger sind. Ich glaube, Silizium Alley Insider Stores Kommentare, die zum Beispiel mit MongoDB verschachtelt sind. Das macht die Abfrage, die Sie erwähnen.

Eine Option ist in der Post eine Liste aller Kommentatoren in einem Array auf oberster Ebene. Stellen Sie sich das als denormalisierte Daten vor. Dann kann man leicht alle Beiträge finden, die einen bestimmten Kommentator betreffen. Um zu bohren, verwenden Sie MAP/Reduzierung oder db.eval (), um die verschachtelten Post -Info integrieren zu lassen.

Ein weiterer Hinweis: Wenn Sie sich mit einem einzigen Dokument befassen, ist db.eval () wahrscheinlich leichter als MAP/Reduzierung. $ wo ist auch eine Option, kann aber langsam sein, daher mag ich die zusätzliche "Liste der oben genannten Kommentatoren" - nicht auch einfach zu indizieren, dass das Array (siehe "Multikey" in den Dokumenten).

Siehe auch:http://groups.google.com/group/mongodb-user/browse_thread/thread/df8250573c91f75a/e880d9c57e343b52?lnk=gst&q=trees#e880d9c57e343b52

Andere Tipps

In dem Link von DMs Post Dwight Merriman erwähnt ein Pfadschlüssel und die Regex -Übereinstimmungen

{
  path : "a.b.c.d.e.f"
}

Eine andere Möglichkeit, dies zu tun, wäre bei Arrays

{
  path : ["a", "b", "c", "d", "e", "f"]
}

db.test.ensureIndex({path: 1})

Das sollte es ziemlich schnell machen.

Wenn jeder Knoten nur auf einem einzigen Weg sein kann, müssten Sie sich keine Sorgen darüber machen, wo er sich in der Liste befindet

db.test.find({path: "a"})

würde alle Kinder von "a" finden

Anstelle von Pfadnamen würde ich wahrscheinlich die _id der Knoten verwenden.

Aktualisieren

  • Eine Sache, auf die Sie vorsichtig sind, ist, dass ein Index nur ein Array enthalten kann.
  • Achten Sie auf Ihre Fragen zu erklären

    db.test.find ({path: {$ in: ["a", "b"]})

gibt Ihnen

 db.test.find({path: {$in: ["a", "b"]}}).explain()
{
        "cursor" : "BtreeCursor path_1 multi",
        "nscanned" : 2,
        "nscannedObjects" : 2,
        "n" : 1,
        "millis" : 0,
        "nYields" : 0,
        "nChunkSkips" : 0,
        "isMultiKey" : true,
        "indexOnly" : false,
        "indexBounds" : {
                "path" : [
                        [
                                "a",
                                "a"
                        ],
                        [
                                "b",
                                "b"
                        ]
                ]
        }
}

aber

 db.test.find({path: {$all: ["a", "b"]}}).explain()
{
        "cursor" : "BtreeCursor path_1",
        "nscanned" : 1,
        "nscannedObjects" : 1,
        "n" : 1,
        "millis" : 0,
        "nYields" : 0,
        "nChunkSkips" : 0,
        "isMultiKey" : true,
        "indexOnly" : false,
        "indexBounds" : {
                "path" : [
                        [
                                "a",
                                "a"
                        ]
                ]
        }
}

verwendet nur das erste Element und scannt dann alle passenden Ergebnisse für b.
Wenn A Ihr Root -Element ist oder sich in den meisten Ihrer Datensätze befindet, dann machen Sie einen nahezu vollständigen Scan der Datensätze anstelle einer effizienten Indexabfrage.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top