Пользовательский поиск данных в массиве

Можно ли искать пользовательские данные учетной записи, чтобы найти значение, содержащееся в массиве?

Что-то вроде:

?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 будет искать один вложенный JSON favoriteThings объект, а не массив.

Да, с помощью 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 также был добавлен в массив.

Другие вопросы по тегам