簡體   English   中英

Firestore 查詢文檔以字符串開頭

[英]Firestore query documents startsWith a string

是否可以查詢 firestore 集合以獲取以特定字符串開頭的所有文檔?

我已經閱讀了文檔,但沒有找到任何合適的查詢。

你可以,但它很棘手。 您需要搜索大於或等於所需字符串且小於后繼鍵的文檔。

例如,要查找包含字段的文檔'foo'與盯着'bar'你會質疑:

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

這實際上是我們在客戶端實現中使用的一種技術,用於掃描與路徑匹配的文檔集合。 我們的后繼密鑰計算掃描器調用,該掃描器正在查找以當前用戶 ID 開頭的所有密鑰。

與吉爾吉爾伯特的回答相同。 只是一個增強和一些示例代碼。 使用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 中的所有搜索條件都區分大小寫。

用較短的版本擴展以前的答案:

  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;
}

如果你來這里尋找 Dart/Flutter 版本

歸功於 Kyojava 答案

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')
)

以上都是正確的! 只是想給出一個更新的答案!

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()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM