在数组中自定义数据搜索

时间:2016-12-01 17:39:21

标签: stormpath express-stormpath

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

类似的东西:

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

Stormpath docs没有提及数组搜索。

2 个答案:

答案 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对象,而不是数组。