Mencoba mengambil beberapa dokumen dari Koleksi berdasarkan daftar DocumentID dan tidak dapat membuat yang berikut ini berfungsi menggunakan WhereIn dan FieldPath. Versi Nuget Google.Cloud.Firestore v1.1.0

public async Task<IEnumerable<T>> GetByDocumentIdWhereIn(IEnumerable<string> documentIds)
{
    CollectionReference ref= FirestoreDb.Collection(_collectionName);
    Query query = ref.WhereIn(FieldPath.DocumentId, documentIds);
    QuerySnapshot querySnapshot = await query.GetSnapshotAsync();
    ...
}

Dan saya mendapatkan kesalahan berikut ketika dijalankan dengan beberapa documentIds.

RpcException: Status(StatusCode=InvalidArgument, Detail="__key__ filter value must be a Key")
System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
Grpc.Core.Internal.ClientResponseStream+<MoveNext>d__5.MoveNext() in ClientResponseStream.cs
System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
System.Linq.AsyncEnumerable+<ForEachAsync_>d__174.MoveNext() in ForEach.cs
System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
Google.Cloud.Firestore.Query+<GetSnapshotAsync>d__54.MoveNext() in Query.cs
System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
System.Runtime.CompilerServices.TaskAwaiter.GetResult()

Ada ide?

1
skjagini 20 Mei 2020, 09:50

1 menjawab

Jawaban Terbaik

Catatan: jawaban ini ditulis sebelum rilis Google.Cloud.Firestore 2.1.0. Pada 2.1.0, kode asli akan berfungsi.


Ini adalah pengecualian yang dibuat oleh server, tetapi memungkinkan untuk mengubah kueri di sisi klien agar berfungsi. Jika nilai yang diberikan adalah nilai DocumentReference, bukan hanya string, kueri akan berfungsi.

Itu berarti sekarang Anda dapat memperbaiki kode Anda seperti ini:

CollectionReference coll = FirestoreDb.Collection(_collectionName);
var docRefs = documentIds.Select(id => coll.Document(id)).ToList();
Query query = coll.WhereIn(FieldPath.DocumentId, docRefs);
QuerySnapshot querySnapshot = await query.GetSnapshotAsync();

Di masa mendatang, kami berharap dapat melakukannya untuk Anda secara otomatis; kemajuan dalam hal ini akan dilacak pada masalah GitHub ini.

Perhatikan bahwa jika Anda hanya ingin mengambil kumpulan cuplikan dokumen dan Anda memiliki (atau dapat membuat) urutan nilai DocumentReference, alternatifnya adalah menggunakan FirestoreDb.GetAllSnapshotsAsync.

1
Jon Skeet 3 Juni 2020, 08:32