Firestore: несколько «массив-содержит» - PullRequest
0 голосов
/ 16 октября 2018

Я пытаюсь отфильтровать данные с помощью нескольких методов where(), используя оператор array-contains, однако у меня возникает следующая ошибка:

An error occured: Error: 3 INVALID_ARGUMENT: 
A maximum of 1 'ARRAY_CONTAINS' filter is allowed.

По сути, у меня есть коллекция, содержащая следующие документы:

product1 
  - node_sku ['sku1', 'sku2', 'sku3' ]

product2 
  - node_sku ['sku4', 'sku5', 'sku6' ]

Тогда у меня есть мой массив с элементами, которые я хочу найти в базе данных:

const list = ['sku4', 'sku2']

Я хочу найти 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) );

Как вы заметили,моя проблема в том, что я перебираю свой массив list, однако мой ref выдает ошибку, поскольку я запускаю 'array-contains' несколько раз.

Я также пытался сравнить смассив:

ref.where('node_sku' , 'array-contains' , list);

который не возвращает ничего, я считаю, что массив-содержимое не сравнивается с массивами, может быть, только строки / числа / логические значения?

Кто-нибудь знает решение для этого безприходится запрашивать их индивидуально?

Спасибо

Ответы [ 2 ]

0 голосов
/ 24 октября 2018

Одним из решений было бы сохранение «тегов» в объекте в качестве имен его свойств. node_sku = { "sku1": true, "sku2": true, ... "skun": true }

Затем вы можете создать предложения AND WHERE следующим образом: list.forEach( (val) => { ref = ref.where(`node_sku.${val}` , '==' , true); });

Этот подход является ответом на вопрос «без необходимости запрашивать их по отдельности».Однако, как только вы захотите упорядочить и разбить на страницы, вы столкнетесь с другой невидимой кирпичной стеной сложных индексов.

0 голосов
/ 16 октября 2018

Как вы обнаружили, в запросе может быть только одна array-contains операция.Идея разрешения множественного числа в настоящее время не поддерживается, но может быть действительной.Поэтому я рекомендую вам подать запрос на добавление функции .

. Единственное решение, которое я могу придумать для вашего варианта использования сейчас, - это также включить комбинации.Поэтому, если вы хотите разрешить тестирование для существующих двух SKU, вы разбиваете массив, чтобы также содержать каждую комбинацию (объединение ключей в лексикографическом порядке):

product1 
  - node_sku ['sku1', 'sku2', 'sku3', 'sku1_sku2', 'sku1_sku3', 'sku2_sku3' ]

Для двух, которые все еще могут быть разумными, нокомбинаторный взрыв сделает его невозможным.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...