プログラミング学習

【firebase】firestoreの全ユーザーデータ(uid)取得とadd/set/updateの違い

プログラミング学習

firestoreのデータ操作に関する覚書です。

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は何度もそのコードを通る場合、上書きなので注意が必要です。

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があるか否かで判定するようにしました。

参考になれば幸いです。

コメント

タイトルとURLをコピーしました