Пользовательский поиск данных в массиве
Можно ли искать пользовательские данные учетной записи, чтобы найти значение, содержащееся в массиве?
Что-то вроде:
?customData.[arrayName].{key}=value
Документы Stormpath не упоминают поиск по массиву.
2 ответа
Поиск пользовательских данных в массиве определенно можно сделать. Синтаксис: customData.{fieldName}\[{index}\]=value
где {index}
может быть конкретный индекс, который вы ищете, или *
если вы хотите найти его где-нибудь в массиве. (Обратите внимание, что []
символы экранируются обратной косой чертой, или интерпретатор запросов путает его с запросом диапазона.)
Если вы полностью исключите индекс, то \[*\]
подразумевается. Точнее, Stormpath проверит любое значение в fieldName
или значение в качестве элемента в массиве fieldName
, Тем не менее, синтаксический сахар может работать, только если поле массива является последним элементом в вашем поиске. Поскольку вы можете поместить буквально любой объект JSON в свои пользовательские данные, Stormpath не может проверить каждую возможность. Представь что-то вроде customData.foo.bar.baz.qux=bingo
, Stormpath не будет пытаться догадаться, что, возможно, foo
это массив, может быть bar
это массив или нет, может быть baz
это массив или нет - только возможно qux
это массив или нет. Таким образом, если вы хотите найти массив объектов, вы не можете пропустить \[*\]
,
Вот пример. У меня есть аккаунт с пользовательскими данными:
{
"favoriteThings": [
{
"thing": "raindrops",
"location": "on roses"
},
{
"thing": "whiskers",
"location": "on kittens"
},
{
"thing": "snowflakes",
"location": "on my nose and eye lashes"
}
],
"favoriteColors": [
"blue",
"grey"
]
}
Следующие запросы приведут к следующим результатам:
customData.favoriteColors=blue
будет включать эту учетную запись.customData.favoriteColors\[1\]=blue
не будет включать эту учетную запись, потому чтоblue
не по индексу 1.customData.favoriteThings\[*\].thing=whiskers
будет включать этот аккаунтcustomData.favoriteThings\[*\].thing=ponies
не будет включать эту учетную запись, потому что она не перечисляет пони как одну из его любимых вещей, но может включать другие учетные записи с пользовательскими данными в той же структуре.customData.favoriteThings.thing=whiskers
не будет включать эту учетную запись или любые другие учетные записи с той же пользовательской структурой данных, потому что в этом случае Stormpath будет искать один вложенный JSONfavoriteThings
объект, а не массив.
Да, с помощью Stormpath можно полностью выполнять поиск пользовательских данных, даже если значения хранятся в виде массива!
Обратите внимание, что имена полей - это простые имена, а значения - это разные типы данных, такие как массив, карта, строка и т. Д., Поэтому запрос не так сложен, как можно было бы подумать:-)
Например, если я хочу сохранить пользовательские данные под названием favoriteColors
, который является массивом
"favoriteColors": [ "red", "black", "blue", "white" ]
Обратите внимание, что имя поля такое же, как и любое другое имя поля. Значением является массив.
Для поиска учетных записей, которые имеют значение red
в favoriteColors
массив, вам просто нужен нормальный синтаксис запроса:
?customData.favoriteColors=red
Полный запрос (при поиске в каталоге учетных записей) может выглядеть следующим образом:
https://api.stormpath.com/v1/directories/<directory_uid>/accounts?customData.favoriteColors=red
Вы также можете выполнить тот же поиск на ресурсе Tenant для поиска по всему арендатору (по всем учетным записям):
https://api.stormpath.com/v1/tenants/<tenant_uid>/accounts?customData.favoriteColors=red
Этот запрос будет соответствовать учетной записи, которая содержит red
в favoriteColors
массив. Если бы я изменил запрос на ?customData.favoriteColors=yellow
это не будет соответствовать, если yellow
также был добавлен в массив.