2017-10-05 4 views
2

J'ai une table qui ressemble à ceci:AQL: Correspondance partielle dans le tableau de chaînes

{"_key": "1", "name": "George Washington", "cars": ["Ford Focus"]} 
{"_key": "2", "name": "John Adams", "cars": ["Pontiac Firebird", "Toyota Corolla"]} 
{"_key": "3", "name": "Thomas Jefferson", "cars": ["Toyota Corolla"]} 
{"_key": "4", "name": "James Madison", "cars": ["Ford Mustang", "Porsche 911"]} 

Maintenant, je voudrais trouver les noms de toutes les personnes qui ont un Ford (c.-à-[ « George Washington » , "James Madison"]). Bien sûr

FOR doc IN documents 
    FILTER ("Ford Focus" IN doc.cars OR "Ford Mustang" IN doc.cars) 
    RETURN doc.name 

fonctionne, mais suppose que je ne sais pas quels types de gués existent. Comment puis-je rechercher une partie d'une chaîne dans un tableau?

Répondre

2

Une façon est de le faire comme ceci:

FOR doc IN documents 
    LET matchingCars = (
    FOR car IN doc.cars 
     FILTER LOWER(car) LIKE('ford%') 
     LIMIT 1 
     RETURN 1 
) 
    FILTER LENGTH(matchingCars) > 0 
    RETURN doc.name 

Quelques notes: la requête travaillera également sans LIMIT, mais en utilisant LIMIT va arrêter la recherche pour faire correspondre les voitures dans un document une fois que l'on a été trouvé dans il. La requête utilise la fonction LIKE pour la correspondance de chaîne, mais vous pouvez bien sûr utiliser any of the others. Enfin, j'ai réduit la valeur de l'attribut car avant de le comparer, car la comparaison devrait être insensible à la casse. S'il vous plaît ajuster à vos besoins.