Syntaxe du sélecteur de requête
Le langage d'IBM Cloudant Query est exprimé sous forme d'objet JSON décrivant les documents qui vous intéressent. Dans cette structure, vous pouvez appliquer une logique conditionnelle en utilisant des zones spécialement nommées.
Le langage d'IBM Cloudant Query présente des similarités avec les documents de requête MongoDB, mais celles-ci proviennent d'objectifs communs et ne signifient pas forcément que les fonctions ou les résultats sont équivalents.
Concepts de base du sélecteur
La syntaxe de sélecteur élémentaire exige que vous spécifiiez une ou plusieurs zones ainsi que les valeurs correspondantes nécessaires pour ces zones. L'exemple de sélecteur ci-dessous met en correspondance tous les documents dont la zone director contient la valeur Lars von Trier.
Voici un exemple de sélecteur simple :
{
"selector": {
"director": "Lars von Trier"
}
}
Si vous avez créé un index de recherche en texte intégral en spécifiant "type":"text" lors de la création de l'index, vous pouvez utiliser l'opérateur $text pour sélectionner les documents correspondants.
Dans l'exemple ci-dessous, l'index de recherche en texte intégral est inspecté pour identifier les documents contenant le mot Bond.
Voici un exemple de sélecteur simple pour un index en texte intégral :
{
"selector": {
"$text": "Bond"
}
}
Vous pouvez créer des expressions de sélecteur plus complexes en combinant des opérateurs. Toutefois, pour les index IBM Cloudant Query de type json, vous ne pouvez pas utiliser d'opérateurs "de combinaison" ou "logiques
de tableau" tels que $regex comme base d'une requête. Seuls les opérateurs d'égalité tels que $eq,
$gt,
$gte,
$lt, et $lte- mais pas $ne- peuvent servir de base à une requête plus complexe. Pour plus d'informations sur la création d'expressions de sélecteur complexes, voir Création d'expressions de sélecteur.
Sélecteur à deux zones
Dans l'exemple ci-dessous, le sélecteur met en correspondance les documents dont la zone name contient la valeur Paul et qui possèdent une zone location dont la valeur est "Boston".
Voici un exemple de sélecteur plus complexe :
{
"selector": {
"name": "Paul",
"location": "Boston"
}
}
Sous-zones
Utilisez un sélecteur plus complexe pour spécifier les valeurs d'une zone d'objets imbriqués ou de sous-zones. Par exemple, vous pouvez utiliser une structure JSON standard pour spécifier une zone et une sous-zone.
Voici un exemple de sélecteur de zone et de sous-zone dans un objet JSON :
{
"selector": {
"imdb": {
"rating": 8
}
}
}
Un équivalent abrégé utilise une notation décimale pour combiner les noms de zone et de sous-zone en nom unique.
Voici un exemple de sélecteur de zone et de sous-zone équivalent utilisant la notation décimale :
{
"selector": {
"imdb.rating": 8
}
}
Construire des expressions de sélection plus complexes
En général, à chaque fois qu'un opérateur admet un argument, cet argument peut être un autre opérateur possédant ses propres arguments. Ce développement permet des expressions de sélecteur plus complexes.
Les opérateurs de combinaison ou les opérateurs logiques de tableau, tels que $regex, peut entraîner en un examen de la base de données entière lorsque vous utilisez des index de type JSON, ce qui provoque une dégradation des performances.
Seuls les opérateurs d'égalité, tels que $eq,
$gt, $gte, $lt, et $lte (mais pas $ne), permettent d'effectuer des recherches dans l'index. Pour vous assurer que les index sont utilisés efficacement, analysez le plan d'explication pour chaque requête.
La majorité des expressions de sélecteur fonctionne exactement comme prévu pour l'opérateur. Les algorithmes de correspondance utilisés par l'opérateur $regex sont actuellement basés sur la bibliothèque PCRE (Compatible
Regular Expression) de la bibliothèque Perl Compatible Regular Expression(PCRE). Toutefois, les bibliothèques PCRE ne sont pas
toutes implémentées. De plus, certaines parties de l'opérateur $regex vont au-delà des offres PCRE. Pour plus d'informations sur ce qui est implémenté, voir les informations sur les expressions régulières d'Erlang.
Utilisation de l'opérateur $text
L'opérateur $text repose sur une recherche Lucene avec un analyseur standard. Il n'est pas sensible à la casse et met en correspondance n'importe quel mot. Toutefois, l'opérateur $text ne prend pas en charge la syntaxe
Lucene complète, comme les caractères génériques, les correspondances partielles et la détection de proximité.
Pour plus d'informations, voir la documentation relative à la recherche. L'opérateur $text s'applique à toutes les chaînes trouvées dans le document. Si vous placez cet
opérateur dans le contexte d'un nom de zone, il n'est pas valide.