Ich verwende RethinkDB (2.3.5 ~ 0trusty) und Python (2.7.6) und Python-Rethinkdb Bindings (2.3.0.post6) und versuchen eine bereits vorhandene Datenbank abfragen. (dh bitte annehmen kann ich nicht das Schema ändern, die ich arbeite mit)Filtern einer Verknüpfung basierend auf Fremdschlüsseln in Listenwerten in RethinkDB
Dies ist ein vereinfachtes Beispiel für das Problem, das ich habe.
Namen von Tabellen/etc wurden in eine Domäne bewegt Leute sind mehr verwendet zu, aber das Problem, das ich habe, ist strukturell gleichwertig (und kompakter).
Borrowers
Schema: (borrower_id:key (primary), name :string, favourite_authors : list of author_id)
Sample data:
{ "borrower_id": "91a15585-f084-41b3-9df1-1a3b16a8daed",
"name": "Jo",
"favourite_authors" : [ "b9503702-8832-43c8-a3f0-34691635419a",
"3bae9a66-2de6-4c64-ae95-c5f7caad86bb",
]
}
{ "borrower_id": "23a8a193-c32e-4332-a40b-2ba56d158205",
"name": "Bob",
"favourite_authors" : [ "41305d3b-2819-4af5-be62-3c7999c4d747",
"d270f08d-aab1-4644-8dea-8f4fdd2d80b4"
]
}
{ "borrower_id": "01031fb0-35de-4324-af47-611fec9ca7ad",
"name": "Sam",
"favourite_authors" : [ "b9503702-8832-43c8-a3f0-34691635419a"
]
}
Autoren
Schema: (author_id:key (primary), name :string, books_written : list of book_id)
Sample data:
{ "author_id": "b9503702-8832-43c8-a3f0-34691635419a",
"name": "Joanna Smith",
"books_written" : [ "c1a48e2e-a831-4f5b-95b2-9b429dcf34e5",
"8f0e89b6-78e8-45ec-b7db-9cf3e00e0a8d",
]
}
{ "author_id": "3bae9a66-2de6-4c64-ae95-c5f7caad86bb",
"name": "John Smith",
"books_written" : [ "8f0e89b6-78e8-45ec-b7db-9cf3e00e0a8d",
"b9fb4de0-e3bd-4df1-b192-c9a0ae7fb2e1",
]
}
{ "author_id": "41305d3b-2819-4af5-be62-3c7999c4d747",
"name": "Jo Smith",
"books_written" : [ "b9fb4de0-e3bd-4df1-b192-c9a0ae7fb2e1",
"37b6eb03-e8ea-43dc-b3e4-ffc0bbfb1154",
]
}
{ "author_id": "d270f08d-aab1-4644-8dea-8f4fdd2d80b4",
"name": "Jim Smith",
"books_written" : [ "8f0e89b6-78e8-45ec-b7db-9cf3e00e0a8d",
"37b6eb03-e8ea-43dc-b3e4-ffc0bbfb1154",
]
}
Bücher
Schema: (book_id:key (primary), name:string, book_info: object, may contain a data
dict, that has a list of
repeatable metadata options...)
Sample data:
{ "book_id": "c1a48e2e-a831-4f5b-95b2-9b429dcf34e5",
"name": "",
"book_info" : {
"data" : [
{ "tag": "sf },
{ "period" : "past"}
]
}
}
{ "book_id": "8f0e89b6-78e8-45ec-b7db-9cf3e00e0a8d",
"name": "",
"book_info" : {
"data" : [
{ "tag": "romance },
{ "period" : "present"}
]
}
}
{ "book_id": "89b68f0e-78e8-45ec-b7db-9cf3e00e0a8d",
"name": "",
"book_info" : {
"data" : [
{ "period" : "present"}
]
}
}
{ "book_id": "b9fb4de0-e3bd-4df1-b192-c9a0ae7fb2e1",
"name": "",
"book_info" : {
"data" : [
{ "tag": "sf },
{ "tag": "romance},
{ "period" : "present"}
]
}
}
...
{ "book_id": "37b6eb03-e8ea-43dc-b3e4-ffc0bbfb1154",
"name": "",
"book_info" : {
"data" : [
{ "tag": "sf },
{ "period" : "future"}
]
}
}
nun die gemeinsame Abfrage I entspricht dies ausführen möchten:
- „Können Sie mir eine Liste aller Kreditnehmer geben, die Lieblings-Autoren, die verfasst haben‚sf‘Bücher“ ...
Hinweis: Nicht alle Bücher haben eine Tags Option im Datenteil von Buch info ...
ich versuche, eine Kombination, um herauszufinden, von Verknüpfungen und Filter verwendet RethinkDB der ReQL Abfrageschnittstelle - die ich sicher bin, kann dies tun - aber ich kann nicht eine offensichtliche Art und Weise von ding sehen es.
Mein Ausgangspunkt war bei RethinkDB des zu suchen verschiedenen Join-Optionen, aber ich kann nicht beitreten offensichtliche Art und Weise der Durchführung mit einem Attribut , die enthält eine Liste von Fremdschlüsseln und nicht nur ein Atom Schlüssel sehen. (ich normalerweise entweder würde die Fremdschlüssel auf dem Feld setzen, die wiederholt oder eine Beziehung Tisch bekommt, aber wie ich sage, kann ich nicht die Struktur Ich habe aus)
ich lieber Python orientierte Lösung, aber Javascript (oder jede andere Sprache) wäre praktisch, da ich dann konvertieren kann :-)
Alle Vorschläge willkommen.
Das ist sehr geschätzt - danke - Star! So haarig wie ich es erwartet hatte. Mehrere Lambdas in Python (wo ich es brauche) werden genauso langsam sein - wenn nicht langsamer ... –