LoginSignup
5
2

More than 3 years have passed since last update.

firestoreのクエリで特定のフィールドがないものを指定したい

Last updated at Posted at 2020-11-09

やりたいこと

firestoreのqueryで特定のfieldが存在しないdocumentを持ってきたい。

sample1.ts
// やりたいことのイメージ
const cities: QuerySnapshot = firebase.firestore().collection("cities")
    .where("specificField","==","does not exist") // ここで特定のfieldが存在しないものだけを持ってきたい
    .get();

環境

JSのclient SDK v8.0.1

前提

firestoreのqueryは次のように使うことができる。

sample2.ts

// citiesというcollectionへの参照を取得
const citiesRef: CollectionReference = firebase.firestore().collection("cities");

// cities(collection)のなかに以下の5つのdocumentをセット
citiesRef.doc("SF").set({name: "San Francisco", state: "CA"});
citiesRef.doc("LA").set({name: "Seattle"      , state: "WA"});
citiesRef.doc("DC").set({name: "Houston"      , state: "TX"});
citiesRef.doc("TK").set({name: "Tokyo"        , state: null});
citiesRef.doc("BJ").set({name: "Beijing"                   });


// クエリの例

const query1: Query = citiesRef.where("state", "==", "CA");
// stateがCAのもの
// result:SF

const query2: Query = citiesRef.where("state", "==", null);
// stateがnullのもの
// result : TK

const query3: Query = citiesRef.where("state", ">", "");
// stateに値が入っているもの
// result : SF, LA, DC

whereはfieldの有無で条件指定できないため、この例ではBJだけを持ってくるということはできない。sample1.tsのような形では実現できない。

解決策

クエリの段階ではfieldがないものだけを選択するということができないので、get()したあとの配列で処理を行う。

sample3.js
const citiesSnapshot: QuerySnapshot = firebase.firestore().collection("cities").get();
const cities = citiesSnapshot.doc.filter((doc) => !doc.data().hasOwnProperty("state"));
// stateというfieldが存在しないもの
// result: BJ

参考

Cloud Firestore で単純なクエリと複合クエリを実行する

ついにFirestoreに != クエリが来たので検証してみた

5
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
2