是否可以搜索帐户的自定义数据以查找包含在数组中的值?
就像是:
?customData.[arrayName].{key}=value
Stormpath文档没有提到数组搜索。
是的,使用Stormpath,即使值存储为数组,也完全可以搜索自定义数据!
请注意,字段名称是简单的名称,值是不同的数据类型,如数组、映射、字符串等......所以查询并不像人们想象的那么复杂 :-)
例如,如果我想存储名为 的自定义数据favoriteColors
,它是一个类似的数组
"favoriteColors": [ "red", "black", "blue", "white" ]
请注意,字段名称与任何其他字段名称一样。值是数组。
red
要搜索在favoriteColors
数组中有值的帐户,您只需要正常的查询语法:
?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
此查询将匹配包含red
在favoriteColors
数组中的帐户。如果我将查询更改为?customData.favoriteColors=yellow
它将不匹配,除非yellow
也添加到数组中。
在数组中搜索自定义数据绝对可以完成。语法是:customData.{fieldName}\[{index}\]=value
where{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
对象,而不是数组。