我们如何从angularfire查询firebase以匹配两个条件。 我想在以下两个条件下搜索 AND 匹配
或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" } }
答案 0 :(得分:5)
Firebase查询目前只能包含一个orderBy...
来电。它们也只能查询比返回的节点低一级的属性。
因此,您无法以最初希望的方式实施您的要求:
// THIS IS AN EXAMPLE THAT WILL NOT WORK
ref.child('color')
.orderByChild('color').equalTo('red')
.orderByChild('color/categories').equalTo('hex');
在某些情况下,您可以通过引入一个顶级属性来组合您想要过滤的值。因此,假设您的颜色只能在一个类别中。然后,您可以添加其他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结构中的不同级别,因为你正在将这些属性规范化并在正确的级别上升级为单个值。
但由于您的类别是多值的,因此这种方法也不起作用。我能想到的唯一方法是在数据上创建所谓的二级索引。
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~']
将提供所有蓝色十六进制。