firestoreのデータ操作に関する覚書です。
Contents
firebase(firestore)の全ユーザーデータ(uid)の取得
const userRef = firebase.firestore().collection('users')
userRef
.get()
.then((snap) => {
snap.forEach((doc) => {
console.log('firestoreのuid', doc.id)
})
})
.catch((error) => {
console.log(error)
})
- uid以外も取得できます。
- adminを使ってfirebase authenticationのデータを取得する方法もあるようです(未検証)。
- ただ、uidはauthenticationとfirestoreのものは一緒
const { users } = await admin.auth().listUsers()
const userIds = users.map((u) => {
return u.uid
})
firebaseの登録ユーザー名重複チェック
whereを使うと重複チェックにも使えそうです。一種の検索の考え方ですね。
userRef
.where('name', '==', name)
.get()
.then((snap) => {
snap.forEach((doc) => {
this.errorName = 'その名前は誰かが取得済みです。'
})
})
.catch((error) => {
console.log(error)
})
firebaseの全データを取得(vuexの場合)
vuexの場合。
const userRef = firebase.firestore().collection('users')
export const actions = {
users({ commit }) {
userRef
.get()
.then((snap) => {
snap.forEach((doc) => {
console.log(doc.id, '=>', doc.data())
})
})
.catch((error) => {
console.log(error)
})
}
}
get()で単一ドキュメントのデータ取得
const currentUser = firebase.auth().currentUser
const docRef = firebase
.firestore()
.collection('users')
.doc(currentUser.uid)
docRef.get().then((doc) => {
if (doc.exists) {
console.log('doc.data()', doc.data())
const name = doc.data().name
}
}
データの削除
管理画面から個別にできます。
チェックボックスを1つ減らした場合は、とりあえずフロントの方をコメントアウトして切ってしまえば、それ以降のユーザーは追加できなくなります。あとはゴミデータを削除するか否かだけです。
firebase(firestore)のデータの追加/置換/更新(addとsetとupdateの違い)
- addは追加。
- setは追加(上書き)。{ merge: true }でマージ。
- updateは特定のフィールドの更新(置換)。
サンプル。setとupdateを使うことが多い。.docは省略可だけど大抵入れます。
firebase.firestore.collection('Users').doc('userID').add({
ID,
name
})
firebase.firestore.collection('Users').doc('userID').set({
ID,
name
})
firebase.firestore.collection('Users').doc('userID').update({
name, // 名前だけを置換
text // テキストを追加
})
setの上書きは注意
setは何度もそのコードを通る場合、上書きなので注意が必要です。
firebaseでset()するときに既存のデータがあった場合に完全に上書きされないように、{ merge: true }属性を渡すと、うまく統合してくれるそうな。
— 木村 拓光@React💻 (@taku_19921219) August 12, 2021
上手くできてんな。
Firebaseでset繰り返すと、ドキュメントが上書きされるんや!!😱
— Eigo Akita (@eigo199825) February 6, 2021
update やね〜
updateの置換に注意(setの{ merge: true }との違い)
updateは置換のようです。updateした箇所がオブジェクトの場合、中身が丸々置換されます。0にappleというオブジェクトがあった場合、1にorangeをいれるとappleが消えるのです。
しかし、setの{ merge: true }はうまくマージしてくれて消えません。
setとupdateの使い分け
updateはデータがない状態ではエラーのようです。
そのため、初期時にユーザーデータを作成する際や一部のオブジェクトを書き換える場合は、setの{ merge: true }つき。その他はupdateでしょうか。
firebase authenticationの登録者を判定
setの{ merge: true }にする理由は、firebase authが登録済みのユーザーか否か判定できないようなので、ログインするたびにそのコードを通るとmerge: trueしないと初期化されます。。ソーシャルログインの場合です。
stackoverflowの質問文が参考になります。
登録者か初回登録者かはfirestore側の登録IDがあるか否かで判定するようにしました。
参考になれば幸いです。
コメント