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]