Syntax des Abfrageselektors
Die IBM Cloudant Query-Sprache wird in Form von JSON-Objekten formuliert, die interessante Dokumente beschreiben. Innerhalb dieser Struktur können Sie Bedingungslogik mithilfe besonders benannter Felder anwenden.
Die IBM Cloudant Query-Sprache weist einige Ähnlichkeiten mit MongoDB-Abfragedokumenten auf, allerdings sind diese Ähnlichkeiten auf Gemeinsamkeiten des Zwecks zurückzuführen und nicht unbedingt als Funktions- oder Ergebnisäquivalenz aufzufassen.
Grundlegende Informationen zur Selektorsyntax
Die elementare Selektorsyntax erfordert die Angabe eines oder mehrerer Felder und der entsprechenden Werte, die für diese Felder benötigt werden. Im folgenden Beispielselektor werden Überstimmungen mit allen Dokumenten gesucht, die ein Feld
director enthalten, das den Wert Lars von Trier hat.
Beispiel für einen einfachen Selektor:
{
"selector": {
"director": "Lars von Trier"
}
}
Wenn Sie einen Volltextindex durch die Angabe "type":"text" erstellt haben, können Sie den Operator $text zur Auswahl übereinstimmender Dokumente verwenden. Im folgenden Beispiel wird der Volltextindex
durchsucht, um jedes Dokument zu finden, das das Wort Bond enthält.
Beispiel für einen einfachen Selektor für einen Volltextindex:
{
"selector": {
"$text": "Bond"
}
}
Sie können komplexere Selektorausdrücke durch Kombinieren von Operatoren erstellen. Für IBM Cloudant Query-Indizes vom Typ json können Sie jedoch keine Kombinationsoperatoren oder logische Array-Operatoren wie $regex als Basis einer Abfrage verwenden. Nur die Gleichheitsoperatoren wie $eq,
$gt,
$gte,
$lt, und $lte- aber nicht $ne- können als Grundlage für eine komplexere Abfrage verwendet werden. Weitere Informationen zur Erstellung komplexer Selektorausdrücke finden Sie unter Selektorausdrücke erstellen.
Selektor mit zwei Feldern
Im folgenden Beispiel sucht der Selektor jedes Dokument, das ein Feld name mit dem Wert Paul und außerdem ein Feld location mit dem Wert "Boston" enthält.
Beispiel für einen komplexeren Selektor:
{
"selector": {
"name": "Paul",
"location": "Boston"
}
}
Unterfelder
Sie können einen komplexeren Selektor verwenden, um die Werte für ein Feld von verschachtelten Objekten oder Unterfeldern anzugeben. Sie können zum Beispiel eine JSON-Standardstruktur zur Angabe eines Felds und eines Unterfelds verwenden.
Beispiel für einen Feld- und Unterfeldselektor in einem JSON-Objekt:
{
"selector": {
"imdb": {
"rating": 8
}
}
}
Als abgekürzte äquivalente Angabe kann eine Punktschreibweise verwendet werden, um den Namen des Felds und den Namen des Unterfelds zu einem Namen zu kombinieren.
Beispiel für einen äquivalenten Feld- und Unterfeldselektor in Punktschreibweise:
{
"selector": {
"imdb.rating": 8
}
}
Aufbau komplexerer Selektorausdrücke
Wenn Sie einen Operator haben, der ein Argument akzeptiert, kann das Argument normalerweise selbst wiederum ein Operator mit eigenen Argumenten sein. Diese Erweiterung ermöglicht komplexere Selektorausdrücke.
Kombinationsoperatoren oder logische Array-Operatoren wie $regex können zu einem vollständigen Datenbankscan führen, wenn Sie Indizes vom Typ JSON verwenden, was wiederum Leistungseinbußen zur Folge hat. Nur Gleichheitsoperatoren,
wie z. B. $eq,
$gt, $gte, $lt und $lte (aber nicht $ne), aktivieren Sie Indexabfragen. Um sich zu vergewissern, ob Indizes effektiv verwendet werden, analysieren Sie den Explain-Plan für jede Abfrage.
Die meisten Selektorausdrücke funktionieren genau so, wie Sie dies für den Operator erwarten würden. Die Anpassungsalgorithmen, die vom $regex Operator verwendet werden, basieren derzeit auf der Bibliothek Perl Compatible Regular Expression(PCRE). Allerdings ist nicht die gesamte PCRE-Bibliothek implementiert. Darüber hinaus überschreiten einige Teile des Operators $regex die von PCRE
angebotene Funktionalität. Für weitere Informationen darüber, was implementiert ist, siehe die Informationen zu regulären Ausdrücken in Erlang.
Verwendung des Operators $text
Der Operator $text basiert auf einer Lucene-Suche mit einer Analysefunktion 'standard'. Der Operator unterscheidet die Groß-/Kleinschreibung nicht und gleicht mit allen Wörtern ab. Allerdings unterstützt der Operator $text nicht die vollständige Lucene-Syntax, wie zum Beispiel Platzhalter, grobe Übereinstimmungen oder räumliche Nähe.
Weitere Informationen finden Sie in der Suchdokumentation. Der Operator $text wird auf alle Zeichenfolgen angewendet, die im Dokument gefunden werden. Die Angabe dieses
Operators im Kontext eines Feldnamens ist ungültig.