web-dev-qa-db-ja.com

Firestoreクエリドキュメントは文字列で始まります

で始まる特定の文字列であるすべてのドキュメントを取得するために、firestoreコレクションを照会することは可能ですか?

ドキュメントを調べましたが、これに適したクエリが見つかりません。

24
Bishwajyoti Roy

できますが、注意が必要です。必要な文字列以上、後続キー未満のドキュメントを検索する必要があります。

たとえば、'foo'で始まる'bar'フィールドを含むドキュメントを検索するには、次のクエリを実行します。

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

これは実際には、パスに一致するドキュメントのコレクションをスキャンするためにクライアント実装で使用する手法です。 後続キーの計算 は、現在のユーザーIDで始まるすべてのキーを検索する スキャナー によって呼び出されます。

44
Gil Gilbert

ギル・ギルバートの回答と同じ。単なる拡張機能といくつかのサンプルコード。 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);

すべての言語とユニコードで動作します。

警告:firestoreの検索条件はすべて大文字と小文字が区別されます。

29
Kyo Kurosagi

以前の回答をより短いバージョンで拡張する:

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