क्या हम सीधे <के साथ किसी दस्तावेज़ पर फ़िल्टर कर सकते हैं code>ReferenceField's एक ही क्वेरी में फ़ील्ड?
नहीं, ReferenceField
. के फ़ील्ड वाले दस्तावेज़ को सीधे फ़िल्टर करना संभव नहीं है ऐसा करने के लिए जुड़ने की आवश्यकता होगी और मोंगोडब जुड़ने का समर्थन नहीं करता है।
डेटाबेस संदर्भ: पर MongoDB डॉक्स के अनुसार
दूसरे पेज से आधिकारिक साइट पर:
इसलिए 1 क्वेरी में, हम दोनों कार्यों
को फ़िल्टर नहीं कर सकते हैं एक विशेष ध्वज मान के साथ और दिए गए user_id
. के साथ और task_id
UserTasks
. पर मॉडल।
फिर फ़िल्टरिंग कैसे करें?
आवश्यक शर्तों के अनुसार फ़िल्टरिंग करने के लिए, हमें 2 प्रश्नों को निष्पादित करने की आवश्यकता होगी।
पहली क्वेरी में हम कार्यों
. को फ़िल्टर करने का प्रयास करेंगे दिए गए task_id
. के साथ मॉडल और ध्वज
. फिर, दूसरी क्वेरी में, हम UserTasks
. को फ़िल्टर करेंगे दिए गए user_id
. के साथ मॉडल और कार्य
पहली क्वेरी से लिया गया।
उदाहरण:
मान लें कि हमारे पास user_id
है , task_id
और हमें यह जांचना होगा कि क्या संबंधित कार्य में ध्वज
है मान 0
. के रूप में .
पहली क्वेरी
हम सबसे पहले my_task
. को पुनः प्राप्त करेंगे दिए गए task_id
. के साथ और ध्वज
0
. के रूप में ।
my_task = Tasks.objects.get(task_id=task_id, flag=0) # 1st query
दूसरी क्वेरी
फिर दूसरी क्वेरी में, आपको UserTask
. पर फ़िल्टर करना होगा दिए गए user_id
. के साथ मॉडल और my_task
वस्तु।
my_user_task = UserTasks.objects.get(user_id=user_id, tasks=my_task) # 2nd query
आपको दूसरी क्वेरी तभी करनी चाहिए जब आपको my_task
. मिले दिए गए task_id
के साथ ऑब्जेक्ट करें और ध्वज
मूल्य। साथ ही, यदि कोई मेल खाने वाली वस्तु नहीं है तो आपको त्रुटि प्रबंधन जोड़ना होगा।
क्या होगा यदि हमने एम्बेडेड दस्तावेज़
का उपयोग किया है कार्यों
. के लिए मॉडल?
मान लें कि हमने अपने कार्यों
. को परिभाषित कर दिया है दस्तावेज़ एक एम्बेडेड दस्तावेज़
. के रूप में और कार्य
UserTasks
. में फ़ील्ड एक एम्बेडेडडॉक्यूमेंटफ़ील्ड
. के रूप में मॉडल , तो वांछित फ़िल्टरिंग करने के लिए हम नीचे कुछ ऐसा कर सकते थे:
my_user_task = UserTasks.objects.get(user_id=user_id, tasks__task_id=task_id, tasks__flag=0)
विशेष my_task
प्राप्त करना कार्यों की सूची से
उपरोक्त क्वेरी एक UserTask
लौटाएगी दस्तावेज़ जिसमें सभी कार्य
शामिल होंगे . फिर हमें वांछित कार्य प्राप्त करने के लिए किसी प्रकार की पुनरावृत्ति करने की आवश्यकता होगी।
ऐसा करने के लिए, हम enumerate()
. का उपयोग करके सूची समझ कर सकते हैं .तब वांछित सूचकांक लौटाई गई 1-तत्व सूची का पहला तत्व होगा।
my_task_index = [i for i,v in enumerate(my_user_task.tasks) if v.flag==0][0]