1. ホーム
  2. javascript

[解決済み] Firestoreで「オブジェクトの配列」を更新する方法とは?

2022-04-24 01:19:20

質問

現在、Firestoreを試していますが、非常に簡単なことで行き詰っています:"配列(別名サブドキュメント)"を更新する。

私のDB構造は超シンプルです。例えば

proprietary: "John Doe",
sharedWith:
  [
    {who: "[email protected]", when:timestamp},
    {who: "[email protected]", when:timestamp},
  ],

に新しいレコードをプッシュしようとしている(成功しない)。 shareWith オブジェクトの配列です。

試してみました。

// With SET
firebase.firestore()
.collection('proprietary')
.doc(docID)
.set(
  { sharedWith: [{ who: "[email protected]", when: new Date() }] },
  { merge: true }
)

// With UPDATE
firebase.firestore()
.collection('proprietary')
.doc(docID)
.update({ sharedWith: [{ who: "[email protected]", when: new Date() }] })

どれもうまくいきません。これらのクエリは私の配列を上書きします。

答えは簡単かもしれませんが、見つけられませんでした...。

解決方法は?

2018年08月13日編集 : Cloud Firestoreのネイティブ配列操作のサポートが追加されました。以下を参照してください。 Dougの回答 の下にあります。


現在、Cloud Firestore では、単一の配列要素を更新する(または単一の要素を追加/削除する)方法はありません。

こちらのコードです。

firebase.firestore()
.collection('proprietary')
.doc(docID)
.set(
  { sharedWith: [{ who: "[email protected]", when: new Date() }] },
  { merge: true }
)

にドキュメントを設定するようにと書かれています。 proprietary/docID そのような sharedWith = [{ who: "[email protected]", when: new Date() } が、既存のドキュメントプロパティに影響を与えないようにする。 これは update() の呼び出しがありますが set() の呼び出しは、ドキュメントが存在しない場合にそれを作成するのに対し update() の呼び出しは失敗します。

つまり、やりたいことを実現するために、2つの選択肢があるわけです。

オプション 1 - 配列全体を設定する

コール set() を配列の全内容で使用する場合、最初にDBから現在のデータを読み込む必要があります。 もし同時更新が心配なら、トランザクションの中でこのすべてを行うことができます。

オプション2 - サブコレクションを使用する

を作成することができます。 sharedWith をメインドキュメントのサブコレクションとして使用します。そして を追加すると、次のようになります。

firebase.firestore()
  .collection('proprietary')
  .doc(docID)
  .collection('sharedWith')
  .add({ who: "[email protected]", when: new Date() })

もちろん、これには新たな制約があります。をクエリすることはできません。 ドキュメントを誰と共有しているかに基づいて、そのドキュメントを作成することはできません。 ドキュメントを取得し、すべての sharedWith のデータを1回の操作で取得することができます。