前提・実現したいこと
- ユーザーが記事を投稿できるサービスをNext.jsとFirebase v9で作成しています。
- 投稿した記事は公開状態と非公開状態に切り替えることができます。
- Firestoreは以下の構造になっています。
usersCollection └── userDocument ├── uid ├── userName ├── publicArtilcesCollection │ └── articleDocument │ ├── articleId │ └── articleTitle └── draftArticlesCollection └── articleDocument ├── articleId └── articleTitle
記事の編集を行なうページで記事を情報を取得する際、公開状態の記事も非公開状態の記事も問わず編集できるようにしたいと考えているため、publicCollection
とdraftCollection
を横断的に検索して、articleId
の値が一致するドキュメントを取得したいです。
また、読み取り時間や金銭的なコストを抑えるため、親コレクションの範囲内で検索するようにしたいです。
例えば、
- 全ユーザーのpublicとdraftからaritlceIDが一致するドキュメントを取得
ではなく、
- 単一ユーザーのpublicとdraftからaritlceIDが一致するドキュメントを取得
したいです。
発生している問題・エラーメッセージ
publicまたはdrafどちらか一方のドキュメントのみしか取得できていないです。
該当のソースコード
現状、記事編集ページで下記のコードにより、一方のサブコレクションからのみ、ドキュメントを取得できています。
javascript
1const { user } = useAuth(); 2useEffect(() => { 3 const { articleID } = router.query; 4 const getArticleData = async () => { 5 const currentApp = getApp(); 6 const db = getFirestore(currentApp); 7 const usersCollection = collection(db, "users"); 8 const userDocRef = doc(usersCollection, user.uid); 9 const articleRef = doc( 10 collection(userDocRef, "publicArticles"), 11 articleID 12 ); 13 const articleDoc = await getDoc(articleRef); 14 const articleData = articleDoc.data(); 15 console.log(articleData); 16 }; 17 getArticleData(); 18}, []);
調べたこと
条件を指定してドキュメントを取得する場合where
を使うかと思い、下記ドキュメントを確認しました。
Cloud Firestore で単純なクエリと複合クエリを実行する | Firebase Documentation
ドキュメントのコード例を見ると、いずれもコレクションを指定する必要があるように見受けられました。
補足情報(FW/ツールのバージョンなど)
- Next.js 11.1.2
- Firebase 9.0.2
あなたの回答
tips
プレビュー