web-dev-qa-db-ja.com

Firebase無効なドキュメント参照。ドキュメント参照には、偶数のセグメントが必要です

このクエリの何が問題になっていますか?

const db = firebase.firestore()
const query = db.doc(this.props.user.uid).collection('statements').orderBy('uploadedOn', 'desc').limit(50)

次のエラーが表示されます。

Uncaught Error: Invalid document reference. Document references must have an even number of segments, but FrMd6Wqch8XJm32HihF14tl6Wui2 has 1
    at new FirestoreError (index.cjs.js:346)
    at Function.DocumentReference.forPath (index.cjs.js:15563)
    at Firestore.doc (index.cjs.js:15368)
    at UploadStatementPresentation.componentWillMount (UploadStatementPage.jsx:61)
    at UploadStatementPresentation.componentWillMount (createPrototypeProxy.js:44)
    at callComponentWillMount (react-dom.development.js:6872)
    at mountClassInstance (react-dom.development.js:6968)
    at updateClassComponent (react-dom.development.js:8337)
    at beginWork (react-dom.development.js:8982)
    at performUnitOfWork (react-dom.development.js:11814)
5
Jiew Meng

クエリの対象を正確に説明していないので、例外なくすべてのドキュメントをコレクションに含める必要があることを指摘します。だから、あなたがこれを言うなら:

_db.doc(this.props.user.uid)
_

Firestoreは、doc()に渡す文字列に、スラッシュで区切られたコレクションとドキュメントIDの両方が含まれていると想定しています。しかし、これはあなたの場合には非常にありそうもないようです。 uidがどのコレクションにあるかを判断し、クエリするコレクションへの参照を構築するときに最初にそれを使用する必要があります。 uidドキュメントにstatementsサブコレクションがあり、他のコレクションにuidドキュメントが含まれていると仮定すると、次のようにフルパスを指定する必要があります。

_db.collection('that-other-collection').doc(this.props.user.uid).collection('statements')
_

もちろん、データの実際の構造を知っているのはあなただけです。

18
Doug Stevenson

クエリを使用してドキュメントのコレクションを取得する場合、ドキュメントIDを指定する必要はありません。この場合、以下のコードが機能するはずです。

const query = db.collection('statements').orderBy('uploadedOn', 'desc').limit(50)

または、ドキュメントを取得する場合は、ドキュメントIDをdoc()メソッドに渡すことができます。その場合、コードは次のようになります。

const query = db.collection('statements').doc(this.props.user.uid)

ファイヤーストームデータのクエリの詳細: https://firebase.google.com/docs/firestore/query-data/get-data?authuser=

0
ctrleffive