angularfire 有没有办法查询匹配和条件

is there a way in angularfire to query for matching AND condition

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

  1. 如果你的钥匙有红色
  2. 如果您的密钥具有 十六进制类别

或者 .indexOn 或 .validate 等 firebase 中的验证是什么

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"
    }
}

一个 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~'] 将给出所有蓝色六边形。