Firestore 查询文档以字符串开头
Firestore query documents startsWith a string
是否可以查询 firestore 集合以获取所有以特定字符串开头的文档?
我已经阅读了文档,但没有找到任何合适的查询。
可以,但这很棘手。您需要搜索大于或等于您想要的字符串且小于后继键的文档。
例如,要查找包含以 'bar'
开头的字段 'foo'
的文档,您可以查询:
db.collection(c)
.where('foo', '>=', 'bar')
.where('foo', '<', 'bas');
这实际上是我们在客户端实现中使用的一种技术,用于扫描与路径匹配的文档集合。我们的 successor key computation is called by a scanner 正在查找以当前用户 ID 开头的所有键。
与 Gil Gilbert 的回答相同。
只是一个增强和一些示例代码。
使用 String.fromCharCode and 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);
适用于任何语言和任何 Unicode。
警告:firestore 中的所有搜索条件都是区分大小写的。
用较短的版本扩展以前的答案:
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;
}
以上正确!只是想给出更新的答案!
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()
如果您来这里是为了寻找 Dart/Flutter 版本
归功于
final strFrontCode = term.substring(0, term.length - 1);
final strEndCode = term.characters.last;
final limit =
strFrontCode + String.fromCharCode(strEndCode.codeUnitAt(0) + 1);
final snap = await FirebaseFirestore.instance
.collection('someCollection')
.where('someField', isGreaterThanOrEqualTo: term)
.where('someField', isLessThan: limit)
.get();
我找到了这个,非常适合 startsWith
const q = query(
collection(firebaseApp.db, 'capturedPhotos'),
where('name', '>=', name),
where('name', '<=', name + '\uf8ff')
)
是否可以查询 firestore 集合以获取所有以特定字符串开头的文档?
我已经阅读了文档,但没有找到任何合适的查询。
可以,但这很棘手。您需要搜索大于或等于您想要的字符串且小于后继键的文档。
例如,要查找包含以 'bar'
开头的字段 'foo'
的文档,您可以查询:
db.collection(c)
.where('foo', '>=', 'bar')
.where('foo', '<', 'bas');
这实际上是我们在客户端实现中使用的一种技术,用于扫描与路径匹配的文档集合。我们的 successor key computation is called by a scanner 正在查找以当前用户 ID 开头的所有键。
与 Gil Gilbert 的回答相同。 只是一个增强和一些示例代码。 使用 String.fromCharCode and 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);
适用于任何语言和任何 Unicode。
警告:firestore 中的所有搜索条件都是区分大小写的。
用较短的版本扩展以前的答案:
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;
}
以上正确!只是想给出更新的答案!
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()
如果您来这里是为了寻找 Dart/Flutter 版本
归功于
final strFrontCode = term.substring(0, term.length - 1);
final strEndCode = term.characters.last;
final limit =
strFrontCode + String.fromCharCode(strEndCode.codeUnitAt(0) + 1);
final snap = await FirebaseFirestore.instance
.collection('someCollection')
.where('someField', isGreaterThanOrEqualTo: term)
.where('someField', isLessThan: limit)
.get();
我找到了这个,非常适合 startsWith
const q = query(
collection(firebaseApp.db, 'capturedPhotos'),
where('name', '>=', name),
where('name', '<=', name + '\uf8ff')
)