Dapatkah kita langsung memfilter dokumen dengan ReferenceField's
bidang dalam satu kueri?
Tidak, tidak mungkin untuk langsung memfilter dokumen dengan bidang ReferenceField karena melakukan ini akan memerlukan bergabung dan mongodb tidak mendukung bergabung.
Sesuai dengan dokumen MongoDB di referensi basis data:
Dari laman yang lain di situs resmi:
Jadi dalam 1 kueri, kami tidak dapat memfilter tasks dengan nilai flag tertentu dan dengan user_id yang diberikan dan task_id pada UserTasks model.
Bagaimana cara melakukan pemfilteran?
Untuk melakukan pemfilteran sesuai dengan ketentuan yang diperlukan, kita perlu melakukan 2 kueri.
Pada query pertama kita akan mencoba memfilter Tasks model dengan task_id yang diberikan dan flag . Kemudian, pada kueri ke-2, kami akan memfilter UserTasks model dengan user_id yang diberikan dan tasks diambil dari kueri pertama.
Contoh:
Katakanlah kita memiliki user_id , task_id dan kita perlu memeriksa apakah tugas terkait memiliki flag nilai sebagai 0 .
Kueri Pertama
Pertama-tama kita akan mengambil kembali my_task dengan task_id yang diberikan dan flag sebagai 0 .
my_task = Tasks.objects.get(task_id=task_id, flag=0) # 1st query
Kueri ke-2
Kemudian pada kueri ke-2, Anda perlu memfilter UserTask model dengan user_id yang diberikan dan my_task objek.
my_user_task = UserTasks.objects.get(user_id=user_id, tasks=my_task) # 2nd query
Anda harus melakukan kueri ke-2 hanya jika Anda mendapatkan my_task objek dengan task_id yang diberikan dan flag nilai. Selain itu, Anda perlu menambahkan penanganan kesalahan jika tidak ada objek yang cocok.
Bagaimana jika kita telah menggunakan EmbeddedDocument untuk Tasks modelnya?
Katakanlah kita telah mendefinisikan Tasks dokumen sebagai EmbeddedDocument dan tasks bidang di UserTasks model sebagai EmbeddedDocumentField , kemudian untuk melakukan penyaringan yang diinginkan kita bisa melakukan sesuatu seperti di bawah ini:
my_user_task = UserTasks.objects.get(user_id=user_id, tasks__task_id=task_id, tasks__flag=0)
Mendapatkan my_task tertentu dari daftar tugas
Kueri di atas akan mengembalikan UserTask dokumen yang akan berisi semua tasks . Kami kemudian perlu melakukan semacam iterasi untuk mendapatkan tugas yang diinginkan.
Untuk melakukan itu, kita dapat melakukan pemahaman daftar menggunakan enumerate() .Kemudian indeks yang diinginkan akan menjadi elemen pertama dari daftar 1-elemen yang dikembalikan.
my_task_index = [i for i,v in enumerate(my_user_task.tasks) if v.flag==0][0]