Firestore:多个'array-contains'

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)

我想搜索sku4sku2,如果发现任何返回对象.

我的问题是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__

这种方法是"无需单独查询"问题的答案.但是,只要你想要订购和分页,你就会遇到另一个看不见的复合指数砖墙.


Dan*_*lip 8

Firestore 推出了另一个与 in 查询类似的功能,即 array-contains-any 查询。此功能允许您同时对多个值执行包含数组的查询。

ref = ref.where('node_sku' , 'array-contains-any' , list);
Run Code Online (Sandbox Code Playgroud)

Firestore - 数组包含任何

  • 如果我想查找仅包含 item1 和 item2 的用户怎么办?array contains 将获得所有包含 1 或 2 的内容,对吗? (11认同)

Fra*_*len 6

如您所知array-contains,查询中只能有一个操作。当前不支持允许多个的想法,但可能是有效的。因此,我建议您提出功能请求

我现在可以想到的唯一解决方案就是同时包含这些组合。因此,如果要允许测试两个SKU的存在,则将数组分解为还包含每个组合(按字典顺序合并键):

product1 
  - node_sku ['sku1', 'sku2', 'sku3', 'sku1_sku2', 'sku1_sku3', 'sku2_sku3' ]
Run Code Online (Sandbox Code Playgroud)

对于两个人来说,这也许仍然是合理的,但是联合爆炸将使其变得不可行。

  • 我的问题是我有数千个sku,由于所有组合都太长了,因此我将无法创建它。我觉得每次遇到Firebase问题时,就像用脑袋撞墙一样。我将向他们提出要求。您一如既往地乐于助人!谢谢弗兰克 (3认同)