সংগ্রহ, প্রকাশনা এবং সাবস্ক্রিপশনগুলি উল্কার একটি জটিল ক্ষেত্র, যা ডকুমেন্টেশন আরও বিশদভাবে আলোচনা করতে পারে, যাতে ঘন ঘন বিভ্রান্তি এড়াতে পারে , যা কখনও কখনও বিভ্রান্তিকর পরিভাষা দ্বারা বিস্তৃত হয় ।
এখানে এর Sacha Greif (সহ-লেখক DiscoverMeteor ) একটি স্লাইড প্রকাশিত এবং সদস্যতাগুলি ব্যাখ্যা করে:
আপনাকে কেন find()
একাধিকবার কল করতে হবে তা সঠিকভাবে বুঝতে , আপনাকে বুঝতে হবে আবহাওয়াতে কীভাবে সংগ্রহ, প্রকাশনা এবং সাবস্ক্রিপশন কাজ করে:
আপনি মঙ্গোডিবিতে সংগ্রহগুলি সংজ্ঞায়িত করেন। এখনও কোনও উল্কা জড়িত নেই। এই স w গ্রহ ধারণ ডাটাবেসের রেকর্ড (এছাড়াও "নথি" উভয় মোঙ্গো ডাকা এবং উল্কা , কিন্তু একটি "দস্তাবেজ" একটি ডাটাবেস রেকর্ড চেয়ে বেশি সাধারণ করেছে, যেমন, একটি আপডেট স্পেসিফিকেশন বা ক্যোয়ারী নির্বাচক দলিল নেই খুব - জাভাস্ক্রিপ্ট ধারণকারী বস্তু field: value
জোড়া)।
তারপর আপনি সংজ্ঞায়িত সংগ্রহের উল্কা সার্ভারে সঙ্গে
MyCollection = new Mongo.Collection('collection-name-in-mongo')
এই সংগ্রহগুলিতে মঙ্গোডিবি সংগ্রহের সমস্ত ডেটা রয়েছে এবং আপনি MyCollection.find({...})
সেগুলি চালাতে পারেন যা একটি কার্সার (রেকর্ডের একটি সেট, তাদের মাধ্যমে পুনরাবৃত্তি করার পদ্ধতিগুলি সহ এবং সেগুলি ফিরিয়ে দেবে) ফিরিয়ে দেবে।
এই কার্সারটি (বেশিরভাগ সময়) রেকর্ডের একটি সেট প্রকাশ করতে (প্রেরণে) ব্যবহৃত হত ( "রেকর্ড সেট" নামে পরিচিত )। আপনি recordsচ্ছিকভাবে এই রেকর্ডগুলি থেকে কিছু ক্ষেত্র প্রকাশ করতে পারেন । এটি রেকর্ড সেট ( সংগ্রহ নয় ) যা ক্লায়েন্টরা সাবস্ক্রাইব করে। প্রকাশনা একটি প্রকাশনা ফাংশন দ্বারা করা হয় , যা প্রতিবার নতুন ক্লায়েন্ট সাবস্ক্রাইব করে ডাকা হয় এবং কোন রেকর্ডগুলি প্রত্যাবর্তন করতে হবে (যেমন কোনও ব্যবহারকারীর আইডি, কেবলমাত্র সেই ব্যবহারকারীর নথিগুলি ফিরিয়ে আনতে হবে) তা পরিচালনা করতে প্যারামিটারগুলি নিতে পারে।
ক্লায়েন্টে , আপনার মিনিমঙ্গো সংগ্রহ রয়েছে যা সার্ভার থেকে কিছু রেকর্ড আংশিকভাবে মিরর করে। "আংশিকভাবে" কারণ এগুলিতে কেবলমাত্র কয়েকটি ক্ষেত্র এবং "কিছু রেকর্ড" থাকতে পারে কারণ আপনি সাধারণত ক্লায়েন্টকে কেবলমাত্র প্রয়োজনীয় রেকর্ডগুলি পাঠাতে চান পৃষ্ঠার লোড গতি বাড়িয়ে তুলতে এবং কেবল এটির যা প্রয়োজন এবং এতে অনুমতি রয়েছে অ্যাক্সেস।
মিনিমোঙ্গো মূলত খাঁটি জাভাস্ক্রিপ্টে মংগোর অবিচল বাস্তবায়ন। এটি একটি স্থানীয় ক্যাশে হিসাবে কাজ করে যা এই ক্লায়েন্টটির সাথে কাজ করা ডাটাবেসের কেবলমাত্র উপসেট সঞ্চয় করে। ক্লায়েন্টের অনুসন্ধানগুলি (সন্ধান করুন) সার্ভারের সাথে কথা না বলেই এই ক্যাশে থেকে সরাসরি পরিবেশন করা হয়।
এই মিনিমোঙ্গো সংগ্রহগুলি প্রাথমিকভাবে খালি। তারা দ্বারা পূরণ করা হয়
Meteor.subscribe('record-set-name')
কল। নোট করুন যে সাবস্ক্রাইব করতে পরামিতি কোনও সংগ্রহের নাম নয়; এটি একটি রেকর্ড সেটের নাম যা publish
কলটিতে সার্ভারটি ব্যবহার করেছিল । subscribe()
কলের জন্য একটি ক্লায়েন্ট সদস্যতা রেকর্ড সেট সব (যেমন সাম্প্রতিকতম 100 ব্লগ পোস্ট) সার্ভারে সংগ্রহ থেকে রেকর্ডগুলির একটি সাবসেট, অথবা একটি (শুধুমাত্র যেমন প্রতিটি রেকর্ডের ক্ষেত্রের উপসেট - title
এবং date
)। মিনিমোঙ্গো কীভাবে জানবেন যে আগত রেকর্ডগুলি রাখবেন কোন সংগ্রহের মধ্যে? সংগ্রহের নাম হবে collection
প্রকাশ হ্যান্ডলার এর ব্যবহৃত যুক্তি added
, changed
এবং removed
callbacks, অথবা যদি ঐ (যে ক্ষেত্রে অধিকাংশ সময় হয়) অনুপস্থিত, এটা সার্ভারে MongoDB সংগ্রহ নাম হবে।
রেকর্ড সংশোধন করা হচ্ছে
এটি এখানেই উল্কা জিনিসগুলিকে খুব সুবিধাজনক করে তোলে: আপনি যখন ক্লায়েন্টের মিনিমোঙ্গো সংগ্রহে একটি রেকর্ড (নথি) পরিবর্তন করেন, তখন উল্কা তত্ক্ষণাত তার উপর নির্ভরশীল সমস্ত টেম্পলেটগুলি আপডেট করবেন এবং পরিবর্তনগুলি সার্ভারেও ফেরত পাঠিয়ে দেবেন, যার ফলস্বরূপ মঙ্গোডিবি-র পরিবর্তনগুলি সংরক্ষণ করবে এবং তাদের উপযুক্ত ক্লায়েন্টদের কাছে পাঠিয়ে দেবে যারা সেই দস্তাবেজ সহ কোনও রেকর্ড সেটটিতে সদস্যতা নিয়েছে। একে বিলম্বিত ক্ষতিপূরণ বলা হয় এবং এটি উল্কার সাতটি মূল নীতিগুলির মধ্যে একটি ।
একাধিক সাবস্ক্রিপশন
আপনি সদস্যতাগুলি একটি গুচ্ছ যে বিভিন্ন রেকর্ডে টান, কিন্তু তারা সব একই সংগ্রহে ক্লায়েন্টের শেষ করব যদি সার্ভারে একই সংগ্রহ, তাদের উপর ভিত্তি করে থেকে এসেছিলেন থাকতে পারে _id
। এটি পরিষ্কারভাবে ব্যাখ্যা করা হয়নি, তবে উল্কা ডক্স দ্বারা বোঝানো হয়েছে:
আপনি যখন কোনও রেকর্ড সেটে সাবস্ক্রাইব করেন, এটি সার্ভারকে ক্লায়েন্টকে রেকর্ড পাঠাতে বলে। ক্লায়েন্ট দোকানে স্থানীয় Minimongo সংগ্রহের এই রেকর্ড, নামেই collection
ব্যবহৃত যুক্তি হ্যান্ডলার এর প্রকাশ added
, changed
এবং removed
callbacks। মিলটি সংগ্রহের নাম সহ ক্লায়েন্টে মঙ্গো.ক্লেশনটি ঘোষণা না করা পর্যন্ত উল্কার আগত বৈশিষ্ট্যগুলিকে সারি করা হবে।
কি ব্যাখ্যা না কি যখন আপনি হয় না স্পষ্টভাবে ব্যবহার added
, changed
এবং removed
যা অধিকাংশ সময় হয় - বা সব সময়ে হ্যান্ডেলার প্রকাশ করুন। এই সর্বাধিক সাধারণ ক্ষেত্রে, সংগ্রহটি যুক্তিটি (আশ্চর্যজনকভাবে) মঙ্গোডিবি সংগ্রহের নাম থেকে নেওয়া হয়েছে যা আপনি প্রথম ধাপে সার্ভারে ঘোষণা করেছিলেন But তবে এর অর্থ হ'ল আপনার বিভিন্ন নামের সাথে বিভিন্ন প্রকাশনা এবং সাবস্ক্রিপশন থাকতে পারে এবং সমস্ত রেকর্ডগুলি ক্লায়েন্টের একই সংগ্রহের মধ্যে শেষ হবে। শীর্ষ স্তরের ক্ষেত্রের স্তর পর্যন্ত , উল্কি নথিগুলির মধ্যে একটি সেট ইউনিয়ন সম্পাদনের যত্ন নেন, যেমন সাবস্ক্রিপশনগুলি ওভারল্যাপ করতে পারে - বিভিন্ন শীর্ষ স্তরের ক্ষেত্রগুলি ক্লায়েন্টের পাশাপাশি পাশাপাশি ক্লায়েন্টের কাছে পাঠানো হয়, নথিতে নথিতে সংগ্রহ হবেক্ষেত্র দুটি সেট ইউনিয়ন ।
উদাহরণ: একাধিক সাবস্ক্রিপশন ক্লায়েন্টে একই সংগ্রহ পূরণ করে
আপনার একটি ব্লগপোস্ট সংগ্রহ রয়েছে, যা আপনি সার্ভার এবং ক্লায়েন্ট উভয় ক্ষেত্রে একইভাবে ঘোষণা করেন, যদিও এটি বিভিন্ন জিনিস করে:
BlogPosts = new Mongo.Collection('posts');
ক্লায়েন্টের BlogPosts
কাছ থেকে, রেকর্ডগুলি পেতে পারেন:
অতি সাম্প্রতিক 10 ব্লগ পোস্টের সদস্যতা
Meteor.publish('posts-recent', function publishFunction() {
return BlogPosts.find({}, {sort: {date: -1}, limit: 10});
}
Meteor.subscribe('posts-recent');
বর্তমান ব্যবহারকারীর পোস্টগুলিতে সাবস্ক্রিপশন
Meteor.publish('posts-current-user', function publishFunction() {
return BlogPosts.find({author: this.userId}, {sort: {date: -1}, limit: 10});
}
Meteor.publish('posts-by-user', function publishFunction(who) {
return BlogPosts.find({authorId: who._id}, {sort: {date: -1}, limit: 10});
}
Meteor.subscribe('posts-current-user');
Meteor.subscribe('posts-by-user', someUser);
সর্বাধিক জনপ্রিয় পোস্টে সাবস্ক্রিপশন
- ইত্যাদি
এই সমস্ত নথিগুলি সার্ভারে সংগ্রহের posts
মাধ্যমে মংগোডিবিতে সংগ্রহ থেকে আসে এবং ক্লায়েন্টের সংগ্রহ থেকে BlogPosts
শেষ BlogPosts
হয়।
এখন আমরা বুঝতে পারি যে কেন আপনাকে find()
একাধিকবার কল করতে হবে - দ্বিতীয়বার ক্লায়েন্টের উপরে থাকা কারণ সমস্ত সাবস্ক্রিপশন থেকে দস্তাবেজগুলি একই সংগ্রহের মধ্যে শেষ হবে এবং আপনার কেবল যত্নশীলদেরই এনে নেওয়া দরকার। উদাহরণস্বরূপ, ক্লায়েন্টে সর্বাধিক সাম্প্রতিক পোস্টগুলি পেতে, আপনি কেবল সার্ভার থেকে কোয়েরিটি মিরর করুন:
var recentPosts = BlogPosts.find({}, {sort: {date: -1}, limit: 10});
এটি শীর্ষস্থানীয় পোস্ট এবং ব্যবহারকারীর পোস্ট উভয়ই ক্লায়েন্টকে প্রাপ্ত সমস্ত নথি / রেকর্ডগুলিতে একটি কার্সার ফিরিয়ে দেবে। ( ধন্যবাদ জেফ্রি )
BlogPosts.find({})
উভয় প্রকাশনার সাবস্ক্রাইব করার পরে আপনি যদি ক্লায়েন্টের উপর এমনটি করেন তবে সম্ভবত এটি উল্লেখযোগ্য হবে — যেমন এটি বর্তমানে ক্লায়েন্টের সমস্ত নথি / রেকর্ডের একটি কার্সার প্রদান করবে, শীর্ষ পোস্ট এবং ব্যবহারকারীর পোস্ট উভয়ই। আমি এসও তে অন্যান্য প্রশ্ন দেখেছি যেখানে প্রশ্নকর্তা এতে বিভ্রান্ত হয়েছিলেন।