はじめに
以下のような、Mapオブジェクトを持つコレクションに対してWhere句で条件指定してデータ取得するメモ。
自分用備忘録を兼ねる。(むしろそっちの目的が大きい)
検索方法
where('[フィールド名].[Mapオブジェクト内のフィールド名]' , '==' , 'hogehoge')
のように指定する。
上の例だとwhere('data.name','==','hogehoge')
とする。
以下Node.jsのサンプル
const admin = require('firebase-admin');
admin.initializeApp();
const db = admin.firestore();
const hogehoge = db.collection('Hogehoge');
async function getHogehoge() {
try {
const querySnapShot = await hogehoge.where('data.name' , '==' , 'hogehoge').get(); // ここで条件指定する
var datas = [];
querySnapShot.forEach(async (d)=>{
datas.push(await d.data());
});
return datas;
} catch(err) {
throw err;
}
}
module.exports = {
getHogehoge: getHogehoge,
};
演算子==
の部分は公式ドキュメントに載っている他の演算子も利用可能。
https://firebase.google.com/docs/firestore/query-data/queries?hl=ja#query_operators
上記のドキュメントにはMapオブジェクトに対するWhereの指定が明記されてないように見えたので一応自分用にメモとして興した。
FieldPathを使う方法
where('data.name')
のように、whereメソッド内のフィールド名部分にドットを書いて直接記述しても動作するのだが、FiledPath
を使うやり方もある。
const { firestore } = require('firebase-admin');
...
const querySnapShot = await hogehoge.where(new firestore.FieldPath('data' , 'name') , '==' , 'hogehoge');
new firestore.FieldPath('data' , 'name')
がwhere('data.name')
と同じ働きをする。
公式ドキュメントはこちら↓
https://firebase.google.com/docs/reference/js/firebase.firestore.FieldPath?hl=ja