[解決済み] Firestoreで「オブジェクトの配列」を更新する方法とは?
質問
現在、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回の操作で取得することができます。
関連
-
JavaScriptのクロージャの説明
-
[解決済み] Error : 未定義のプロパティ 'map' を読み取ることができません。
-
[解決済み] 配列から特定の項目を削除するにはどうすればよいですか?
-
[解決済み] JavaScript で配列に値が含まれているかどうかを確認するにはどうすればよいですか?
-
[解決済み] 配列に特定のインデックスで項目を挿入する方法 (JavaScript)
-
[解決済み] オブジェクトが配列であるかどうかを確認するにはどうすればよいですか?[重複]。
-
[解決済み】別のウェブページにリダイレクトするにはどうすればいいですか?
-
[解決済み】オブジェクトの配列を文字列のプロパティ値でソートする
-
[解決済み】配列に何かを追加する方法は?
-
[解決済み】オブジェクトからプロパティを削除する(JavaScript)
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
JavaScriptのクロージャの説明
-
vueのグローバルがscss(mixin)を導入。
-
Javascript Bootstrapのグリッドシステム、ナビゲーションバー、ローテーションの説明
-
VUEグローバルフィルターの概念と留意点、基本的な使い方
-
Vueでルートネスティングを実装する例
-
vueのプロジェクトでモックを使用する方法を知っていますか?
-
[解決済み】React - uncaught TypeError: 未定義のプロパティ 'setState' を読み取れない
-
[解決済み】Node.js getaddrinfo ENOTFOUND
-
[解決済み】awaitは非同期関数でのみ有効です。
-
[解決済み] 期待される代入または関数呼び出し: 未使用式なし ReactJS