Документы запросов Firestore начинаются с строки

Можно ли запросить коллекцию firestore для получения всего документа, который начинается с определенной строки?

Я просмотрел документацию, но не нашел подходящего запроса для этого.

Ответ 1

Вы можете, но это сложно. Вам нужно искать документы, которые больше или равны требуемой строке, и меньше, чем ключ-преемник.

Например, чтобы найти документы, содержащие поле 'foo', смотрящее на 'bar', вы должны запросить:

db.collection(c)
    .where('foo', '>=', 'bar')
    .where('foo', '<', 'bas');

Это фактически метод, который мы используем в реализации клиента для сканирования коллекций документов, соответствующих пути. Наш предварительный расчет ключа вызывается сканером, который выглядит для всех клавиш, начинающихся с текущего идентификатора пользователя.

Ответ 2

так же, как ответил Гил Гилберт. Просто улучшение и пример кода. используйте String.fromCharCode и String.charCodeAt

var strSearch = "start with text here";
var strlength = strSearch.length;
var strFrontCode = strSearch.slice(0, strlength-1);
var strEndCode = strSearch.slice(strlength-1, strSearch.length);

var startcode = strSearch;
var endcode= strFrontCode + String.fromCharCode(strEndCode.charCodeAt(0) + 1);

затем отфильтруйте код, как показано ниже.

db.collection(c)
.where('foo', '>=', startcode)
.where('foo', '<', endcode);

Работает на любом языке и любом Юникоде.

Предупреждение: все критерии поиска в пожарном депо ЧУВСТВИТЕЛЬНЫ К СЛУЧАЮ.

Ответ 3

Расширение предыдущих ответов более короткой версией:

  const text = 'start with text here';
  const end = text.replace(/.$/, c => String.fromCharCode(c.charCodeAt(0) + 1));

  query
    .where('stringField', '>=', text)
    .where('stringField', '<', end);

Пример IRL

async function search(startsWith = '') {
  let query = firestore.collection(COLLECTION.CLIENTS);

  if (startsWith) {
      const end = startsWith.replace(
        /.$/, c => String.fromCharCode(c.charCodeAt(0) + 1),
      );

      query = query
        .where('firstName', '>=', startsWith)
        .where('firstName', '<', end);
  }

  const result = await query
    .orderBy('firstName')
    .get();

  return result;
}

Ответ 4

Выше верны! Просто хотел дать обновленный ответ!

var end = s[s.length-1]
val newEnding = ++end

var newString = s
newString.dropLast(1)
newString += newEnding

query
  .whereGreaterThanOrEqualTo(key, s)
  .whereLessThan(key, newString)
  .get()