答案 0 :(得分:4)
是的,使用Stormpath,即使值存储为数组,也完全可以搜索自定义数据!
请注意,字段名称是简单的名称,值是不同的数据类型,如数组,映射,字符串等...所以查询并不像人们想象的那么复杂:-)
例如,如果我想存储名为_score
的自定义数据,这是一个类似
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
也添加到数组中,否则它将无法匹配。
答案 1 :(得分:3)
绝对可以在数组中搜索自定义数据。语法为: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
对象,而不是数组。