নেস্টেড অবজেক্টগুলিকে কীভাবে জিজ্ঞাসা করবেন?


204

নেস্টেড অবজেক্টস নোটেশন দিয়ে মঙ্গোডিবি জিজ্ঞাসা করার সময় আমার একটি সমস্যা আছে:

db.messages.find( { headers : { From: "reservations@marriott.com" } } ).count()
0
db.messages.find( { 'headers.From': "reservations@marriott.com" }  ).count()
5

আমি কী ভুল করছি তা আমি দেখতে পাচ্ছি না। আমি নেস্টেড অবজেক্ট নোটেশনটি ডট নোটেশন কোয়েরির মতো একই ফলাফলটি প্রত্যাশা করছি। আমি কোথায় ভুল করছি?

উত্তর:


419

db.messages.find( { headers : { From: "reservations@marriott.com" } } )

এই দস্তাবেজগুলির জন্য কোয়েরি যেখানে headers সমান { From: ... } , অর্থাৎ অন্য কোনও ক্ষেত্র নেই।


db.messages.find( { 'headers.From': "reservations@marriott.com" } )

এটি কেবল headers.Fromক্ষেত্রটি দেখায় , অন্তর্ভুক্ত থাকা বা নিখোঁজ থাকা অন্যান্য ক্ষেত্রগুলির দ্বারা প্রভাবিত হয় না headers


ডট-নোটেশন ডক্স


"শিরোনাম.ফর্ম" এর আশেপাশে উদ্ধৃতিগুলি ছাড়া এটি করার কোনও উপায় আছে কি?
ট্রাইসিস

আমি জানি না, কেবল আশ্চর্য হয়েছি এবং ভেবেছিলাম এটি কখনও কখনও কার্যকর হতে পারে।
ট্রাইসিস

3
@ ট্রাইসিস - বাস্তবে, আমি খুঁজে পেয়েছি যে ইনলাইন অবজেক্টগুলি ঘোষনা করা (মঙ্গো [ওএস] ডক্সের উদাহরণগুলির মতো, এবং বেশিরভাগ উদাহরণগুলিতে) বাস্তব বিশ্বে কেবল যথেষ্ট নয়। আমি 'কন্ডিশন' এবং 'ফিল্ড' অবজেক্ট তৈরি করার অভ্যাস গড়ে তুলেছি যার উপর আমি conditions['some.path'] = 'value'আমার ব্যবসার লজিকের মতো জিনিসগুলি করতে পারি , তারপরে শেষে একটি একক ক্যোয়ারী চালাতে পারি:find(conditions, fields, callback);
রায়ান হুইল

কি হবে যদি আসুন আমি একটি কী যা রয়েছে "domain.com", এই কাজ না করবে না আছে: domains.domain.com। এই দৃশ্যের জন্য (ডোমেন ডটকমকে অন্য কোনও কিছুতে যেমন ডোমেন_কম পরিবর্তন না করে) কি কোনও কর্মক্ষেত্র রয়েছে?
রেন্স টিলম্যান

1
আমার নিজের মন্তব্যের উত্তরে, আপনার কীগুলিতে বিন্দুগুলি সম্পূর্ণরূপে এড়ানো ভাল। আমার সমাধানে আমি ডোমেনগুলি কী হিসাবে সম্পূর্ণরূপে আঁকলাম, এবং পরিবর্তে একটি স্লাইস / অ্যারে তৈরি করেছি।
রেন্স টিলম্যান

20

বিভিন্ন উপায়ে দুই ক্যোয়ারী প্রক্রিয়া কাজ, মধ্যে প্রস্তাবিত দস্তাবেজ অধ্যায় এ Subdocuments :

ক্ষেত্র একটি এমবেডেড দস্তাবেজ (অর্থাত, ঝুলিতে যখন subdocument ), আপনি হয় সমগ্র নির্দিষ্ট করতে পারেন subdocument "মধ্যে পৌঁছাতে" একটি ক্ষেত্রের মান, অথবা subdocument ডট স্বরলিপি ব্যবহার করে, স্বতন্ত্র ক্ষেত্রের জন্য মান নির্দিষ্ট করার subdocument :

সাব-ডকুমেন্টের মধ্যে সমতা মেলে নথি নির্বাচন করুন যদি সাব-ডকুমেন্টটি ক্ষেত্রের ক্রম সহ নির্দিষ্ট নির্দিষ্ট সাবডোকামেন্টের সাথে ঠিক মেলে।


নিম্নলিখিত উদাহরণে, ক্যোয়ারী সব কাগজপত্র যেখানে ক্ষেত্র প্রযোজকের মান একটি subdocument যে কেবল পঠন ক্ষেত্র রয়েছে মিলে যায় companyমান 'ABC123'ও ফিল্ড addressমান '123 Street', সঠিক অনুক্রমে:

db.inventory.find( {
    producer: {
        company: 'ABC123',
        address: '123 Street'
    }
});

8
আমি পাগল হয়ে যাচ্ছিলাম। এটি আমার কাছে বেশ বেমানান বলে মনে হচ্ছে, কারণ যখন বস্তুগুলি অনুসন্ধান করা হয় তখন এটির সরাসরি বৈশিষ্ট্যগুলি কোনও ক্রমে মেলা যায়।
কপাজ

7

যেহেতু সাব-ডকুমেন্টগুলি দিয়ে মঙ্গোডিবি সংগ্রহের প্রশ্ন সম্পর্কে অনেক বিভ্রান্তি রয়েছে , তাই আমি উপরের উত্তরগুলি উদাহরণ সহ ব্যাখ্যা করার উপযুক্ত বলে মনে করেছি:

প্রথমে আমি সংগ্রহের মধ্যে দুটি মাত্র বস্তু সন্নিবেশ করলাম যথা message:

> db.messages.find().pretty()
{
    "_id" : ObjectId("5cce8e417d2e7b3fe9c93c32"),
    "headers" : {
        "From" : "reservations@marriott.com"
    }
}
{
    "_id" : ObjectId("5cce8eb97d2e7b3fe9c93c33"),
    "headers" : {
        "From" : "reservations@marriott.com",
        "To" : "kprasad.iitd@gmail.com"
    }
}
>

সুতরাং ক্যোয়ারির ফলাফল কী: db.messages.find({headers: {From: "reservations@marriott.com"} }).count()

এটি এক হওয়া উচিত কারণ নথির জন্য এই প্রশ্নের যেখানে headersবস্তুর সমান {From: "reservations@marriott.com"}, কেবলমাত্র অন্য কোনও ক্ষেত্র নেই বা আমাদের পুরো সাব-ডকুমেন্টটিকে ক্ষেত্রের মান হিসাবে নির্দিষ্ট করতে হবে।

সুতরাং @ এডমন্ডো ১৯৮৮ এর উত্তর অনুসারে

যদি subdocument সাথে মেলে মধ্যে উপ-নথি নথি নির্বাচন সমতা সাথে মেলে ক্ষেত্র অর্ডার সহ ঠিক নির্দিষ্ট subdocument,

উপরের বিবৃতি থেকে, নীচের কোয়েরির ফলাফলটি কী হওয়া উচিত?

> db.messages.find({headers: {To: "kprasad.iitd@gmail.com", From: "reservations@marriott.com"}  }).count()
0

এবং যদি আমরা দ্বিতীয় ডকুমেন্টের সাব-ডকুমেন্টের ক্রম Fromএবং তার Toমতোই পরিবর্তন করব ?

> db.messages.find({headers: {From: "reservations@marriott.com", To: "kprasad.iitd@gmail.com"}  }).count()
1

সুতরাং, এটি ক্ষেত্রের ক্রম সহ নির্দিষ্ট সাব-ডকুমেন্টের সাথে ঠিক মেলে ।

ডট অপারেটর ব্যবহারের জন্য, আমি মনে করি এটি প্রত্যেকের জন্য খুব স্পষ্ট। নীচের ক্যোয়ারির ফলাফলটি দেখুন:

> db.messages.find( { 'headers.From': "reservations@marriott.com" }  ).count()
2

আমি আশা করি উপরোক্ত উদাহরণ সহ এই ব্যাখ্যাগুলি উপ-ডকুমেন্টগুলির সাথে কাউকে সন্ধানের বিষয়ে আরও স্পষ্ট করে তুলবে ।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.