Можно ли запросить коллекцию firestore для получения всего документа, который начинается с определенной строки?
Я просмотрел документацию, но не нашел подходящего запроса для этого.
Можно ли запросить коллекцию firestore для получения всего документа, который начинается с определенной строки?
Я просмотрел документацию, но не нашел подходящего запроса для этого.
Вы можете, но это сложно. Вам нужно искать документы, которые больше или равны требуемой строке, и меньше, чем ключ-преемник.
Например, чтобы найти документы, содержащие поле 'foo'
, смотрящее на 'bar'
, вы должны запросить:
db.collection(c)
.where('foo', '>=', 'bar')
.where('foo', '<', 'bas');
Это фактически метод, который мы используем в реализации клиента для сканирования коллекций документов, соответствующих пути. Наш предварительный расчет ключа вызывается сканером, который выглядит для всех клавиш, начинающихся с текущего идентификатора пользователя.
так же, как ответил Гил Гилберт. Просто улучшение и пример кода. используйте 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);
Работает на любом языке и любом Юникоде.
Предупреждение: все критерии поиска в пожарном депо ЧУВСТВИТЕЛЬНЫ К СЛУЧАЮ.
const text = 'start with text here';
const end = text.replace(/.$/, c => String.fromCharCode(c.charCodeAt(0) + 1));
query
.where('stringField', '>=', text)
.where('stringField', '<', end);
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;
}
Выше верны! Просто хотел дать обновленный ответ!
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()