在angularfire中有一种方法可以查询匹配的AND条件

时间:2015-05-10 11:47:28

标签: firebase angularfire

我们如何从angularfire查询firebase以匹配两个条件。 我想在以下两个条件下搜索 AND 匹配

  1. 如果您的密钥颜色为红色
  2. 如果您的密钥有类别hex
  3. 或firebase中的验证,例如.indexOn或.validate

    json就像

    {
    
      "color" : {
        "-UqPNlZ8ddgdGMFSsD" : {
          "color" : "red",
          "categories" : {
            "hex" : {
              "subcategory" : [ "#111", "#333" ]
            }
          },
          "status" : "ok"
        },
        "-U9P4pBpYiId3ID64K" : {
          "color" : "blue",
          "categories" : {
            "hex" : {
              "subcategory" : [ "#ddd", "#eee" ]
            }
          },
          "status" : "ok"
        },
        "-U9UgOdffZdfdbSydF" : {
          "color" : "green",
          "categories" : {
            "hex" : {
              "subcategory" : [ "#333", "#555" ]
            }
          },
          "status" : "ok"
        }
    }
    

1 个答案:

答案 0 :(得分:5)

Firebase查询目前只能包含一个orderBy...来电。它们也只能查询比返回的节点低一级的属性。

因此,您无法以最初希望的方式实施您的要求:

// THIS IS AN EXAMPLE THAT WILL NOT WORK
ref.child('color')
   .orderByChild('color').equalTo('red')
   .orderByChild('color/categories').equalTo('hex');

方法1:添加一个新属性,该属性组合了您要在

上过滤的属性

在某些情况下,您可以通过引入一个顶级属性来组合您想要过滤的值。因此,假设您的颜色只能在一个类别中。然后,您可以添加其他colorcategory属性:

{

  "color" : {
    "-UqPNlZ8ddgdGMFSsD" : {
      "color" : "red",
      "colorcategory": "redhex",
      "categories" : {
        "hex" : {
          "subcategory" : [ "#111", "#333" ]
        }
      },
      "status" : "ok"
    },
    "-U9P4pBpYiId3ID64K" : {
      "color" : "blue",
      "colorcategory" : "bluehex",
      "categories" : {
        "hex" : {
          "subcategory" : [ "#ddd", "#eee" ]
        }
      },
      "status" : "ok"
    },
    "-U9UgOdffZdfdbSydF" : {
      "color" : "green",
      "colorcategory" : "greenhex",
      "categories" : {
        "hex" : {
          "subcategory" : [ "#333", "#555" ]
        }
      },
      "status" : "ok"
    }
}

并过滤:

ref.child('color')
   .orderByChild('colorcategory').equalTo('redhex')

当你有两个单值属性时,这将有效,即使它们位于JSON结构中的不同级别,因为你正在将这些属性规范化并在正确的级别上升级为单个值。

但由于您的类别是多值的,因此这种方法也不起作用。我能想到的唯一方法是在数据上创建所谓的二级索引。

方法2:在要

上过滤的属性上创建二级索引

NoSQL数据库中的索引是一种数据结构,非常类似于关系数据库中的多列索引,它只适用于您的查询。在这种情况下,由于您要查询颜色和类别的组合,我希望索引color_category或甚至color_category_subcategory

color_category_subcategory:
  "red_hex_111": "-UqPNlZ8ddgdGMFSsD"
  "red_hex_333": "-UqPNlZ8ddgdGMFSsD"
  "blue_hex_ddd": "-U9P4pBpYiId3ID64K"
  "blue_hex_eee": "-U9P4pBpYiId3ID64K"
  "green_hex_333": "-U9UgOdffZdfdbSydF"
  "green_hex_555": "-U9UgOdffZdfdbSydF"

您必须在自己的代码中创建和维护此索引,无论是在客户端应用程序中还是通过运行创建它的服务器端进程。但是一旦你有了索引,就可以查询它:

ref.child('color_category_subcategory')
   .orderByKey().equalTo('red_hex_333')
   .on('value', function(snapshot) {...

或按范围:

ref.child('color_category_subcategory')
   .orderByKey().startAt('blue_hex').endAt('blue_hex~')
   .on('value', function(snapshot) {...

上面的~不是一个特殊的运算符,而只是一个恰好落在ASCII序列中所有其他字符之后的字符。因此,过滤['blue_hex', 'blue_hex~']将提供所有蓝色十六进制。