MongoDB
 sql >> Teknologi Basis Data >  >> NoSQL >> MongoDB

Kueri Dokumen Tersemat Mongo

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]


  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Hasil agregat MongoDB dengan dua kunci berbeda

  2. MongoDB tidak dapat mengurai kueri (2dsphere):dua kondisi

  3. Django + Pymongo membuat tautan konfirmasi akun

  4. node-mongodb-native:Bagaimana saya bisa membagikan objek db api dari panggilan balik koneksi melalui aplikasi saya

  5. MongoDB - mongfiles