angularfire 有没有办法查询匹配和条件
is there a way in angularfire to query for matching AND condition
我们如何从 angularfire 查询到 firebase 以匹配两个条件。
我想在以下两个条件下搜索 AND match
- 如果你的钥匙有红色
- 如果您的密钥具有 十六进制类别
或者 .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~']
将给出所有蓝色六边形。
我们如何从 angularfire 查询到 firebase 以匹配两个条件。 我想在以下两个条件下搜索 AND match
- 如果你的钥匙有红色
- 如果您的密钥具有 十六进制类别
或者 .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~']
将给出所有蓝色六边形。