2017-11-22 13 views
1

documentIdで注文したFirestoreデータベースから降順にデータを取得したいとします。私が呼ぶとき:自動インデックス作成のためのFirebaseコンソールへのリンクがFirestoreで文書IDの降順でデータを取得する

FAILED_PRECONDITION: The query requires an index.

firestore.collection("users") 
    .orderBy(FieldPath.documentId(), Query.Direction.DESCENDING) 
    .get() 
    .addOnCompleteListener(new OnCompleteListener<QuerySnapshot>() {...}); 

私はエラーを取得しています。残念ながら、自動作成はこの場合には機能していないようです。私は、インデックスの作成をクリックすると、私はメッセージを取得:手動インデックス作成のために

__name__ only indexes are not supported

を、docは唯一のフィールド名(ないdocumentId)によってインデックス化について述べています。誰でもFirestoreからデータを取得する方法を知っていますか?documentIdで降順で注文しますか?

私はクライアント側でデータを並べ替えることができますが、IDで注文することは、私が何か不足しているはずの自然な仕事です。ありがとうございました。私が使用します。

compile 'com.google.firebase:firebase-firestore:11.6.0' 
+0

firestoreでの読み取りアクセスはどうですか? – phonemyatt

+0

あなたの "ルール" jsonを共有できますか?おそらくあなたは次のようなものが必要でしょう: '".indexOn":["documentId"]' –

+0

テスト中、私はデフォルトのFirestoreアクセス権を持っています。 @NicoT:docへのリンクを送ってください。 – zelig74

答えて

0

Firestoreドキュメントhereに述べたように、クラウドFirestoreが自動生成docIDsの自動発注を提供していません。

Important: Unlike "push IDs" in the Firebase Realtime Database, Cloud Firestore auto-generated IDs do not provide any automatic ordering. If you want to be able to order your documents by creation date, you should store a timestamp as a field in the documents.

したがって、あなたは、このようなユーザーPOJOのクラスフィールドの前にそれを宣言し、annotation @ServerTimestampでそれを設定するだけで、余分なフィールドCreatedDateにを追加することによって順序を達成することができます。

@ServerTimestamp 
Date createdDate; 

また、あなたがPOJOがFirestoreに書かれているとき、このフィールドがnullであることを確認する必要があり、Firestoreにそれを保存する前に、それまでの任意の値を設定しないでください。

+0

Firestoreが自動生成されたIDを注文しない理由は、手動での.orderBy(...)呼び出しにつながりました。問題は、順序付けにインデックスが必要だということです。私はIDで作成する方法がわかりません。 – zelig74

+0

あなたの質問が正しく理解されていれば、自動的に生成されたFirestore IDを索引として追加して、それに基づいて結果を並べ替える必要があります。ここには**二つの**ものがあります:1.)Firebaseチームは、RTDBプッシュIDのような自動発注を提供していないので、照会結果を発注するために自動生成IDを全く使用しないことを勧告します。 2.)文書フィールドは照会索引としてのみ作成でき、IDは文書の一部ではありません。また、デフォルトでは、各docフィールドにはインデックスが付けられています。したがって、上記のように追加のフィールド_createDate_を追加して、ドキュメント作成日に基づいてクエリ結果を並べ替えるようにアドバイスしています。 –

関連する問題