数组内的自定义数据搜索

Custom data search within an array

是否可以搜索帐户的自定义数据以查找数组中包含的值?

类似于:

?customData.[arrayName].{key}=value

Stormpath docs没有提到数组搜索。

是的,使用 Stormpath 完全可以搜索自定义数据,即使值存储为数组!

请注意,字段名称是简单的名称,值是不同的数据类型,如数组、映射、字符串等...因此查询并不像人们想象的那么复杂:-)

例如,如果我想存储名为 favoriteColors 的自定义数据,它是一个类似于

的数组
"favoriteColors": [ "red", "black", "blue", "white" ]

请注意,该字段名称与任何其他字段名称一样。值为数组。

要在 favoriteColors 数组中搜索具有值 red 的帐户,您只需要正常的查询语法:

?customData.favoriteColors=red

完整请求(如果搜索帐户目录)可能如下所示:

https://api.stormpath.com/v1/directories/<directory_uid>/accounts?customData.favoriteColors=red

您也可以在租户资源上执行相同的搜索以搜索租户范围(跨所有帐户):

https://api.stormpath.com/v1/tenants/<tenant_uid>/accounts?customData.favoriteColors=red

此查询将匹配 favoriteColors 数组中包含 red 的帐户。如果我将查询更改为 ?customData.favoriteColors=yellow 它将不匹配,除非 yellow 也被添加到数组中。

在数组中搜索自定义数据绝对可以做到。语法是:customData.{fieldName}\[{index}\]=value 其中 {index} 可以是您要查找的特定索引,或者 * 如果您想在数组中的任何位置找到它。 (请注意 [] 字符使用反斜杠进行转义,否则查询解释器会将其与范围查询混淆。)

如果完全不使用索引,则隐含 \[*\]。更准确地说,Stormpath 将检查 fieldName 中的值作为 [=16] 数组中的元素=].但是,语法糖仅在数组字段是搜索中的最后一个元素时才起作用。由于您几乎可以将任何 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 对象,不是数组。