কোন প্রকার অর্ডার নির্দিষ্ট না করা হলে মোংগোডিবি কীভাবে রেকর্ডগুলি সাজায়?


103

যখন আমরা কোনও মংগো ফাইন্ড () অনুসন্ধান চালিয়ে থাকি যখন নির্ধারিত কোনও সাজানোর আদেশ ছাড়াই ফলাফলটি বাছাই করতে ডাটাবেস অভ্যন্তরীণভাবে কী ব্যবহার করে?

মঙ্গো ওয়েবসাইটে ডকুমেন্টেশন অনুসারে :

কোনও পরামিতিবিহীন কোনও ফাইন্ড () চালানোর সময়, ডাটাবেসগুলি প্রাকৃতিক ক্রমে অবজেক্টগুলি ফেরত দেয়।

স্ট্যান্ডার্ড টেবিলগুলির জন্য, প্রাকৃতিক অর্ডারটি বিশেষভাবে কার্যকর নয় কারণ যদিও অর্ডারটি প্রায়শই সন্নিবেশ আদেশের নিকটে থাকে তবে এটির গ্যারান্টি নেই। তবে ক্যাপড সংগ্রহের জন্য, প্রাকৃতিক অর্ডার সন্নিবেশনের আদেশ হিসাবে গ্যারান্টিযুক্ত। এটি খুব দরকারী হতে পারে।

তবে মান সংগ্রহের জন্য (ক্যাপড সংগ্রহ নয়), ফলাফলগুলি সাজানোর জন্য কোন ক্ষেত্রটি ব্যবহার করা হয়? এটি _দিকের ক্ষেত্র না অন্য কিছু?

সম্পাদনা করুন:

মূলত, আমি অনুমান করি যে আমি কী পেতে চাইছি তা হ'ল যদি আমি নিম্নলিখিত অনুসন্ধান কোয়েরিটি সম্পাদন করি:

db.collection.find({"x":y}).skip(10000).limit(1000);

সময় দুটি ভিন্ন পয়েন্ট করুন: T1 এবং T2 , আমি বিভিন্ন ফলাফলের সেট পাবেন:

  1. যখন টি 1 এবং টি 2 এর মধ্যে কোনও অতিরিক্ত লেখার ব্যবস্থা নেই?
  2. যখন টি 1 এবং টি 2 এর মধ্যে নতুন লেখাগুলি হয়েছে?
  3. টি 1 এবং টি 2 এর মধ্যে নতুন সূচক যুক্ত হয়েছে?

আমি একটি অস্থায়ী ডাটাবেসে কিছু পরীক্ষা চালিয়েছি এবং ফলাফলগুলি আমি পেয়েছি 3 টি ক্ষেত্রে একই ( হ্যাঁ ) - তবে আমি নিশ্চিত হতে চেয়েছিলাম এবং আমি নিশ্চিত যে আমার পরীক্ষার কেসগুলি খুব ভাল ছিল না।

উত্তর:


120

যখন কোনও নির্দিষ্ট না করা হয় তখন ডিফল্ট সাজানোর অর্ডারটি কী?

ডিফল্ট অভ্যন্তরীণ সাজানোর ক্রম (বা প্রাকৃতিক ক্রম ) একটি অনির্ধারিত বাস্তবায়ন বিশদ। শৃঙ্খলা রক্ষা স্টোরেজ ইঞ্জিন ও MongoDB এর API- একটি সুনির্দিষ্ট ভবিষ্যদ্বাণীর বাইরে জনাদেশ নেই জন্য অতিরিক্ত ওভারহেড হয় sort()বা নির্দিষ্ট মাপের বিশেষ মামলায় লাভের সংগ্রহের যা সংযুক্ত করেছেন ব্যবহারগত সীমাবদ্ধতা । সাধারণ কাজের চাপের জন্য স্টোরেজ ইঞ্জিনের জন্য উপলব্ধ পূর্বনির্ধারিত স্থানটি পুনরায় ব্যবহার করার চেষ্টা করা এবং কীভাবে ডিস্কে এবং মেমরিতে সর্বাধিক দক্ষতার সাথে ডেটা সংরক্ষণ করা যায় সে সম্পর্কে সিদ্ধান্ত নেওয়া বাঞ্ছনীয়।

কোনও জিজ্ঞাসার মানদণ্ড ছাড়াই, স্টোরেজ ইঞ্জিন দ্বারা প্রাকৃতিক ক্রমে ফলাফলগুলি ফিরে আসবে ( তারা খুঁজে পাওয়া যায় তার ক্রম অনুসারে )। ফলাফলের ক্রম সন্নিবেশ আদেশের সাথে মিলিত হতে পারে তবে এই আচরণের গ্যারান্টি দেওয়া হয় না এবং এর উপর নির্ভর করা যায় না (ক্যাপড সংগ্রহগুলি বাদ দিয়ে)।

কিছু উদাহরণ যা স্টোরেজ (প্রাকৃতিক) অর্ডারকে প্রভাবিত করতে পারে:

  • ওয়্যারডটাইগার মেমরি ক্যাশে বনাম ডিস্কে নথির বিভিন্ন উপস্থাপনা ব্যবহার করে, তাই অভ্যন্তরীণ ডেটা স্ট্রাকচারের ভিত্তিতে প্রাকৃতিক ক্রম পরিবর্তন হতে পারে।
  • আসল এমএমএপিভি 1 স্টোরেজ ইঞ্জিন (মোংগোডিবি ৪.২-এ সরানো) প্যাডিং বিধিগুলির ভিত্তিতে নথির জন্য রেকর্ড স্থান বরাদ্দ করে। যদি কোনও দস্তাবেজ বর্তমানে বরাদ্দ রেকর্ড স্পেসের বাইরে চলে যায় তবে নথির অবস্থান (এবং প্রাকৃতিক ক্রম) প্রভাবিত হবে। মুছে ফেলা বা সরানো নথির কারণে পুনরায় ব্যবহারের জন্য উপলভ্য চিহ্নিত স্টোরেজে নতুন ডকুমেন্টগুলি sertedোকানো যেতে পারে can
  • প্রতিলিপি প্রতিলিপি সেট সদস্যদের জুড়ে ধারাবাহিকভাবে লেখার ক্রিয়াকলাপ প্রয়োগ করতে একটি আদর্শবান ওপলগ ফর্ম্যাট ব্যবহার করে। প্রতিটি প্রতিলিপি সেট সদস্য স্থানীয় ডাটা ফাইলগুলি বজায় রাখে যা প্রাকৃতিক ক্রমে পরিবর্তিত হতে পারে তবে ওপলগ আপডেটগুলি প্রয়োগ করার সময় একই ডেটা ফলাফল হবে।

কোন সূচক ব্যবহার করা হয় কি?

যদি কোনও সূচক ব্যবহার করা হয়, তবে দস্তাবেজগুলি সেগুলি পাওয়া ক্রমে ফিরে আসবে (যা অবশ্যই সন্নিবেশ আদেশ বা I / O ক্রমের সাথে মেলে)। যদি একাধিক সূচক ব্যবহৃত হয় তবে অর্ডারটি অভ্যন্তরীণভাবে নির্ভর করে যা অন-নকল প্রক্রিয়া চলাকালীন সূচকটি প্রথম নথিকে চিহ্নিত করেছিল।

আপনি যদি পূর্বাভাসযোগ্য সাজানোর আদেশ চান তবে আপনার অবশ্যইsort() আপনার ক্যোয়ারির সাথে একটি স্পষ্ট অন্তর্ভুক্ত করতে হবে এবং আপনার সাজানোর কীটির জন্য স্বতন্ত্র মান থাকতে হবে।

ক্যাপড সংগ্রহগুলি কীভাবে সন্নিবেশ ক্রম বজায় রাখে?

ক্যাপড সংগ্রহগুলিতে প্রাকৃতিক অর্ডারের জন্য উল্লিখিত বাস্তবায়ন ব্যতিক্রমগুলি তাদের বিশেষ ব্যবহারের সীমাবদ্ধতার দ্বারা প্রয়োগ করা হয়: নথি সন্নিবেশ ক্রমে সংরক্ষণ করা হয় তবে বিদ্যমান নথির আকার বাড়ানো যায় না এবং নথিগুলি সুস্পষ্টভাবে মোছা যায় না। অর্ডারিং ক্যা্যাপড কালেকশন ডিজাইনের একটি অংশ যা প্রাচীনতম ডকুমেন্টগুলিকে প্রথমে "বয়স শেষ" নিশ্চিত করে।


4
এর অর্থ কি এই যে যদি আমি একই ফাইন্ড কমান্ডটি চালিত করি: db.collection.find ({"x": y}) সেট? দুটি কমান্ডের মধ্যে যদি সেখানে কোনও লেখা না থাকে তবে কী হবে?
সৌরভ্জ

6
@ সৌরভজ: এমন কিছু উদাহরণ যুক্ত করা হয়েছে যা প্রাকৃতিক ক্রমকে প্রভাবিত করবে। যদি নথিগুলি সরানো / মুছে ফেলা হয় তবে আপনি বিভিন্ন ফলাফলের সেটগুলি পেতে পারেন। যদি কোনও ডকুমেন্ট সন্নিবেশ / আপডেট / মুছে না থাকে তবে আপনার একই ফলাফল পাওয়া উচিত। সূচকগুলি যুক্ত করা ডিস্কে থাকা দস্তাবেজের অবস্থানকে প্রভাবিত করে না।
স্টেনি

7
এই সতর্কতাটিও যুক্ত করা উচিত যে আপনি যদি প্রতিলিপি ব্যবহার করছেন তবে প্রাকৃতিক ক্রম প্রতিরূপ সেট সদস্যদের মধ্যে পৃথক হতে পারে।
স্টেনি

কেউ এখানে কীভাবে মন্তব্য করা 2 টি পয়েন্টের জোর করতে হয় তা জানেন? আমরা নথিগুলি সংশোধন করার চেষ্টা করেছি তবে সেগুলি এখনও তাদের সন্নিবেশ ক্রমে ফিরে এসেছে ... প্রাকৃতিক আদেশ সন্নিবেশনের ক্রম থেকে আলাদা হতে পারে কিনা তা সম্পর্কে আমি আগ্রহী।
ফেরান মেলিনচ

একটি ডিফল্ট অর্ডার {createdAt: -1}প্রয়োগ করা (উদাহরণস্বরূপ ) আশাবাদী ইউআই প্যাটার্নগুলি প্রয়োগ করা (তৈরি / আপডেট / মোছার পরে সার্ভারের প্রতিক্রিয়ার জন্য অপেক্ষা না করে ক্যাশে ডেটা তালিকাগুলি আপডেট করা) implement অন্যথায় আপনি ক্লায়েন্ট-সাইড আশাবাদী অর্ডার এবং সার্ভার প্রতিক্রিয়া অর্ডারের সাথে মিল করতে পারবেন না।
এরিক বুরেেল

8

এটি সঞ্চিত অর্ডারে (ফাইলটিতে অর্ডার) ফেরত দেওয়া হয়, তবে এটি সন্নিবেশিত ক্রমে রয়েছে তা গ্যারান্টিযুক্ত নয়। এগুলি _id ক্ষেত্র অনুসারে বাছাই করা হয় না। কখনও কখনও এটি দেখে মনে হয় এটি সন্নিবেশ ক্রমের মাধ্যমে সাজানো হয়েছে তবে এটি অন্য অনুরোধে পরিবর্তন করতে পারে। এটি নির্ভরযোগ্য নয়।

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