gug*_*der 6 javascript firebase google-cloud-firestore
我试图where()
使用array-contains
运算符使用多种方法过滤数据,但是我遇到以下错误:
An error occured: Error: 3 INVALID_ARGUMENT:
A maximum of 1 'ARRAY_CONTAINS' filter is allowed.
Run Code Online (Sandbox Code Playgroud)
基本上,我有一个包含以下文档的集合:
product1
- node_sku ['sku1', 'sku2', 'sku3' ]
product2
- node_sku ['sku4', 'sku5', 'sku6' ]
Run Code Online (Sandbox Code Playgroud)
然后我有我希望在数据库中找到的项目的数组:
const list = ['sku4', 'sku2']
Run Code Online (Sandbox Code Playgroud)
我想搜索sku4
和sku2
,如果发现任何返回对象.
我的问题是array-contains
不允许多次运行.
这是我用来过滤的代码:
const list = ['sku4', 'sku2'];
let database = firestore_db.collection('glasses');
let ref = database;
list.forEach( (val) => {
ref = ref.where('node_sku' , 'array-contains' , val);
});
ref.get()
.then( (snapshot) => glassesRequestComplete(snapshot, req, response))
.catch( (error) => glassesRequestError(error, response) );
Run Code Online (Sandbox Code Playgroud)
正如你所注意到的,我的问题是我正在循环遍历我的list
数组,但是ref
由于我不止一次地触发'array-contains' ,我正在抛出一个错误.
我也尝试与数组进行比较:
ref.where('node_sku' , 'array-contains' , list);
Run Code Online (Sandbox Code Playgroud)
哪个不返回任何,我相信array-contains不会与数组进行比较,只有字符串/数字/布尔可能?
有没有人知道一个解决方案而不必单独查询它们?
谢谢
小智 9
一种解决方案是将Object中的'tags'存储为其属性名称.
__CODE__
然后你可以像这样创建AND WHERE子句:
__CODE__
这种方法是"无需单独查询"问题的答案.但是,只要你想要订购和分页,你就会遇到另一个看不见的复合指数砖墙.
Firestore 推出了另一个与 in 查询类似的功能,即 array-contains-any 查询。此功能允许您同时对多个值执行包含数组的查询。
ref = ref.where('node_sku' , 'array-contains-any' , list);
Run Code Online (Sandbox Code Playgroud)
如您所知array-contains
,查询中只能有一个操作。当前不支持允许多个的想法,但可能是有效的。因此,我建议您提出功能请求。
我现在可以想到的唯一解决方案就是同时包含这些组合。因此,如果要允许测试两个SKU的存在,则将数组分解为还包含每个组合(按字典顺序合并键):
product1
- node_sku ['sku1', 'sku2', 'sku3', 'sku1_sku2', 'sku1_sku3', 'sku2_sku3' ]
Run Code Online (Sandbox Code Playgroud)
对于两个人来说,这也许仍然是合理的,但是联合爆炸将使其变得不可行。
归档时间: |
|
查看次数: |
4394 次 |
最近记录: |