55

是否可以查询 firestore 集合以获取以特定字符串开头的所有文档?

我已经浏览了文档,但没有找到任何合适的查询。

4

5 回答 5

86

你可以,但这很棘手。您需要搜索大于或等于所需字符串且小于后继键的文档。

例如,要查找包含以您开头的字段的文档'foo''bar'请查询:

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

这实际上是我们在客户端实现中使用的一种技术,用于扫描与路径匹配的文档集合。我们的后继密钥计算由扫描程序调用,该扫描程序正在查找以当前用户 ID 开头的所有密钥。

于 2017-10-04T21:03:49.693 回答
52

与吉尔吉尔伯特的回答相同。只是一个增强和一些示例代码。使用String.fromCharCodeString.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 中的所有搜索条件都是区分大小写的。

于 2017-10-17T08:53:50.223 回答
19

用更短的版本扩展以前的答案:

  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;
}
于 2019-07-31T12:31:44.557 回答
9

如果你来这里寻找 Dart/Flutter 版本

归功于 Kyo的java 回答

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();
于 2020-11-16T15:53:27.580 回答
2

以上是对的!只是想给出一个更新的答案!

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()
于 2019-10-09T04:49:46.770 回答