やりたいこと
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