質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.46%
Cloud Firestore

Cloud Firestore は、自動スケーリングと高性能を実現し、アプリケーション開発を簡素化するように構築された NoSQLドキュメントデータベースです。

Q&A

解決済

1回答

3607閲覧

firestoreでドキュメントの任意の並び順を管理したい

Pltcpx

総合スコア7

Cloud Firestore

Cloud Firestore は、自動スケーリングと高性能を実現し、アプリケーション開発を簡素化するように構築された NoSQLドキュメントデータベースです。

0グッド

0クリップ

投稿2020/02/22 15:23

編集2020/02/23 02:20

firestoreでドキュメントの任意の並び順を管理・更新するためにはどういった方法がよいでしょうか?

FireStoreの構成

学習として、Vue.jsでfirestoreを利用して、並び替えられるToDoリスト(カンバン)を作っています。
リアルタイムアップデートを利用して、多人数で使うことを想定し、ToDo(Task)の並び順をデータに反映させたいです。
storeは以下のような構成です。

//FireStoreでの構成 Boards(Collection) - Board(Document) - Tasks(Collection) - Task(Document)   - タスクのフィールドに個別データ //TasksのCollectionからDocumentを取得のイメージ {tasks:[ {taskDocId:"gadsad", order:0, data:"myToDo"}, {taskDocId:"dafafa", order:1, data:"myToDo"}, {taskDocId:"fasdas", order:2, data:"myToDo"}, {taskDocId:"gadaaf", order:3, data:"myToDo"} ]} //Vue側でToDoのカードとして一覧表示し、任意に順番を並び替える //作成・削除・並び替えタイミングでorderを更新していきたい

どういった方法で任意の順番を管理するのがよいのか、教えていただけませんでしょうか。

A案.Functionsを使う?

  • ソートして取得するための任意の順番をTaskDocumentにもたせようと思っている
  • データが追加されるたびにTasksCollectionの全ドキュメントをクライアント側で取得してorderを書き換えてまわっても、その間に別のユーザーが追加している可能性もあるため、よくないよな、と思う
  • 洗い替え的な処理は、FireBase Functionsでやるものなのでしょうか?

Functionsでやる場合は
0. webクライアント側でユーザーが並び替える
0. クライアント側でorderをローカルで更新し、Documentの更新をFireStoreに送る
0. Functionsでorderの重複を解決する

みたいな感じをイメージしておけばよいでしょうか・・・

B案.親階層のDocumentのフィールドで管理する?

最初、Board DocumentのフィールドにTaskDocumentのIDの配列をもたせて管理しようかと思って試したのですが、

  • 並び替え用配列も同時更新して、クライアント側でソートかけようかと思った
  • 新しいTaskをaddしてIDができた時点でもうリアルタイムアップデートがかかってしまうため、更新にラグが発生してしまいよくなかった

2/23追記:C案.リアルタイム更新対象にしない?

よく考えたらロード時の復元のために並び順が必要なだけで、リアルタイムにFirestoreと同期とれる必要もないのかも?と思い、この項目を足します。

  • 初期化時のみデータのorderで並び替えて取得する
  • 編集画面を離脱するまでリアルタイムアップデート対象にしない。
  • orderデータは更新するが編集中はFirestoreのソート機能を使わない。または編集画面離脱時orderを一括アップデートして整合とる

等、考えているのですが、「FireStoreのDocumentの任意の順番を管理する方法」で定石やよいアイデアがあれば教えてください。

よろしくお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

自己解決

Stackoverflowのほうに、似たような質問があり、以下のような提案がありました。
これの、1.ある程度の間隔のあるindexでやるとわりとすんなり作れたので、これで解決しました。
アップデートするドキュメントも1つだけでいいのでよかったです。
順番を入れ替え続けているとすごい小数点になってしまうので、どこかでリセット処理を入れる必要があるかと思います。

モト

text

1item1 order:100 2item2 order:200 3item3 order:300

1.ある程度間隔のあるindexを使う

前後のindexの中間値を取る。

text

1item2 order:200 2item1 order:250 <- update 3item3 order:300

2.前後順データをもつ

text

1item1 prev:item2 next:item3 <- update 2item2 prev:null next:item1 <- update 3item3 prev:item1 next:null <- update

3.順序管理配列をもつ

text

1item1 id:1 2item2 id:2 3item3 id:3 4 5order:[2,1,3] 6

投稿2020/02/23 06:59

編集2020/02/23 12:37
Pltcpx

総合スコア7

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.46%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問