Вот что я бы сделал: при создании (или обновлении) документа используйте строку, которую вы использовали бы в качестве заголовка, для создания другого свойства, возможно, назовите его searchTerms
:
let docName = 'green apple';
let ref = /* some path */.collection('items').doc(); // optionally use docName here
let doc = { /* however you initialize your doc */ }
doc.searchTerms = docName.split(' ').reduce((acc, term) => {
acc[term] = true;
return acc;
}, {});
// that will set searchTerms to { 'green':true, 'apple':true }
ref.set(doc)
Позже вы можете запросить эти документы следующим образом:
let targetTerm = 'apple'
let key = `searchTerms.${targetTerm}`;
let query = /* some path */.collection('items').where(key, '==', true)
В августе продукт представил поддержку поиска в массивах , так что вы можете пропустить сокращение при создании объекта и спроситьwhere-contains
в запросе, например:
// as before
doc.searchTerms = docName.split(' ');
ref.set(doc)
и позже:
let targetTerm = 'apple'
let query = /* some path */.collection('items').where('searchTerms', 'array-contains', targetTerm)
Вы также можете использовать облачный триггер onCreate
для создания поля условий поиска, поэтому всеточки в коде, где выполняется создание, могут не беспокоиться об этом.