CouchDB Aufrufe: Joins und Unterabfragen

8

Ich habe das auf der CouchDB-Users-Mailingliste gepostet, aber ich dachte, ich würde mein Netz ein wenig breiter machen.

[Links aufgrund der neuen Benutzer-Spam-Regeln von stackoverflow zerstört :-(]

Hoffentlich kann einer von euch schlauen Leuten helfen (oder zumindest kann mir jemand definitiv sagen, was ich zu tun versuche, ist unmöglich und ich werde es tun Ich muss nach Alternativen suchen ... Ich habe gehört, dass MySQL auf dem Markt ist (-:).

Hintergrundinformation: Ich habe hier eine Beispieldatenbank eingerichtet: scoates-test.couchone.com/_utils/database.html?follow / scoates-test.couchone.com/follow

Ich habe zwei Arten von Dokumenten. type = user und type = asset.

Beispiel für einen Benutzer: scoates-test.couchone.com/_utils/document.html?follow/c988a29740241c7d20fc7974be05f67d

Beispiel: scoates-test.couchone.com/_utils/document.html?follow/c988a29740241c7d20fc7974be061d62

Benutzer können anderen Benutzern folgen (das Feld "following" des Typs "Benutzerdokument"). Das obige Beispiel Benutzer (Benutzername = Bob) ist "folgende" 2 Benutzer:

%Vor%

Assets gehören einem bestimmten Benutzer. Das obige Beispiel-Asset gehört c988a29740241c7d20fc7974be061d62 (username = bob).

Hoffentlich macht das Sinn.

Ich möchte Assets anfordern, die zu Benutzern gehören, denen Bob folgt (aaron and dale), und Ich kann meinen Blick nicht auf den Code richten, der dies erlaubt. Ich kann leicht alle Vermögenswerte ausstrahlen gehören zu c988a29740241c7d20fc7974be05f67d.

Ich konnte es in zwei Anfragen tun. Zuerst würde ich CouchDB nach c988a29740241c7d20fc7974be05f67d fragen, und dann die folgenden als "Schlüssel" zu einer Ansicht POST, die Vermögenswerte zurückgibt, die zu diesen Schlüsseln gehören, aber Sie werden feststellen, dass mein Typ = Asset-Dokumente auch ein "wann" -Feld haben, und ich möchte in der Lage sein um dies zu ordnen, indem [doc.owner, doc.when] als Schlüssel ausgegeben wird und dann startKey / endKey verwendet wird. Also POST von Schlüsseln ist out, denke ich.

Ich konnte nur auf der Anwendungsseite beitreten (Abfrage der folgenden Schlüssel, eine Anforderung für jeder dieser Schlüssel, dann auf der App-Seite sortieren), aber das bricht Seitenumbruch wirklich schlecht (ich würde muss für jedes folgende eine Grenze von pageSize anfordern), und das gerät sehr außer Kontrolle schnell (wenn ein Benutzer 1000 Benutzern folgt, sind dies 10.000 Datensätze pro Seite).

Keine dieser Lösungen funktioniert für mich. Ich würde es gerne in CouchDB machen.

Ich bin wirklich ratlos. Bitte helfen.

S

    
scoates 27.11.2010, 18:22
quelle

1 Antwort

10

Es gibt eine grundlegende Regel für CouchDB-Ansichten, die Ihnen helfen können, diese Art von Problem zu lösen.

  

Beim Abfragen einer CouchDB-Ansicht werden null, ein oder mehrere Schlüssel / Wert-ID-Tupel zurückgegeben, sodass Schlüssel, Wert und ID aus demselben Dokument berechnet werden . Sie können optional nach dem Dokument mit der angegebenen ID fragen (dies kann das Dokument sein, das zur Berechnung des Tupels verwendet wurde).

Wenn Sie darüber nachdenken, ist es ziemlich logisch: Jedes Tupel ist die Folge eines emit() , so dass alle ausgegebenen Daten nur aus einem einzigen Dokument stammen können.

In Ihrem speziellen Fall müssen Sie den Tupel-Schlüssel enthalten:

  • Der aktuelle Benutzer, weil Sie nur Dokumente haben möchten, die von diesem Benutzer sichtbar sind
  • Der "Eigentümer" des Dokuments, weil Sie nach diesem Wert sortieren müssen.
  • Das Dokument ist "wann", weil Sie nach diesem Wert sortieren müssen.

Gemäß der Grundregel benötigen Sie ein einziges CouchDB-Dokument, das all diese Elemente enthält. Ihr aktuelles Schema (aktueller Benutzer und Dokumenteigner im Dokument "Benutzer", Dokumenteigentümer und im Dokument "Dokument") führt die erforderlichen Daten nicht zusammen, daher müssen Sie sie ändern.

Mein Vorschlag wäre, ein "Freigabe" -Dokument mit der folgenden Struktur zu verwenden:

%Vor%

Sie müssen diese Struktur immer dann aktualisieren, wenn ein Benutzer dem Eigentümer folgt oder ihn nicht mehr anzeigt oder der Besitzer ein Dokument hinzufügt oder entfernt. Von dort können Sie einfach senden:

%Vor%     
Victor Nicollet 28.11.2010, 13:50
quelle

Tags und Links