মেটিয়ার প্রকাশ / সাবস্ক্রাইব বোঝা tanding


84

আমি একটি সহজ অ্যাপ্লিকেশন পেয়েছি যা এর তালিকা প্রদর্শন করে Projects। আমি autopublishপ্যাকেজটি সরিয়ে ফেলেছি যাতে আমি ক্লায়েন্টের কাছে সবকিছু পাঠাচ্ছি না।

 <template name="projectsIndex">    
   {{#each projects}}      
     {{name}}
   {{/each}}
 </template>

কখন autopublishচালু করা হবে, এটি সমস্ত প্রকল্প প্রদর্শন করবে:

if Meteor.isClient
  Template.projectsIndex.projects = Projects.find()

এটি মুছে ফেলার সাথে, আমার অতিরিক্তভাবে করতে হবে:

 if Meteor.isServer
   Meteor.publish "projects", ->
     Projects.find()
 if Meteor.isClient
   Meteor.subscribe "projects"
   Template.projectsIndex.projects = Projects.find()

সুতরাং, এটি কি ঠিক বলা যায় যে ক্লায়েন্ট-সাইড find()পদ্ধতিটি কেবল রেকর্ড অনুসন্ধান করে যা সার্ভার-সাইড থেকে প্রকাশিত হয়েছে? এটি আমাকে ট্রিপ করে চলেছে কারণ আমার মনে হয়েছিল আমার কেবল find()একবার ফোন করা উচিত ।

উত্তর:


286

সংগ্রহ, প্রকাশনা এবং সাবস্ক্রিপশনগুলি উল্কার একটি জটিল ক্ষেত্র, যা ডকুমেন্টেশন আরও বিশদভাবে আলোচনা করতে পারে, যাতে ঘন ঘন বিভ্রান্তি এড়াতে পারে , যা কখনও কখনও বিভ্রান্তিকর পরিভাষা দ্বারা বিস্তৃত হয়

এখানে এর Sacha Greif (সহ-লেখক DiscoverMeteor ) একটি স্লাইড প্রকাশিত এবং সদস্যতাগুলি ব্যাখ্যা করে:

সাবস্ক্রিপশন

আপনাকে কেন find()একাধিকবার কল করতে হবে তা সঠিকভাবে বুঝতে , আপনাকে বুঝতে হবে আবহাওয়াতে কীভাবে সংগ্রহ, প্রকাশনা এবং সাবস্ক্রিপশন কাজ করে:

  1. আপনি মঙ্গোডিবিতে সংগ্রহগুলি সংজ্ঞায়িত করেন। এখনও কোনও উল্কা জড়িত নেই। এই স w গ্রহ ধারণ ডাটাবেসের রেকর্ড (এছাড়াও "নথি" উভয় মোঙ্গো ডাকা এবং উল্কা , কিন্তু একটি "দস্তাবেজ" একটি ডাটাবেস রেকর্ড চেয়ে বেশি সাধারণ করেছে, যেমন, একটি আপডেট স্পেসিফিকেশন বা ক্যোয়ারী নির্বাচক দলিল নেই খুব - জাভাস্ক্রিপ্ট ধারণকারী বস্তু field: valueজোড়া)।

  2. তারপর আপনি সংজ্ঞায়িত সংগ্রহের উল্কা সার্ভারে সঙ্গে

    MyCollection = new Mongo.Collection('collection-name-in-mongo')
    

    এই সংগ্রহগুলিতে মঙ্গোডিবি সংগ্রহের সমস্ত ডেটা রয়েছে এবং আপনি MyCollection.find({...})সেগুলি চালাতে পারেন যা একটি কার্সার (রেকর্ডের একটি সেট, তাদের মাধ্যমে পুনরাবৃত্তি করার পদ্ধতিগুলি সহ এবং সেগুলি ফিরিয়ে দেবে) ফিরিয়ে দেবে।

  3. এই কার্সারটি (বেশিরভাগ সময়) রেকর্ডের একটি সেট প্রকাশ করতে (প্রেরণে) ব্যবহৃত হত ( "রেকর্ড সেট" নামে পরিচিত )। আপনি recordsচ্ছিকভাবে এই রেকর্ডগুলি থেকে কিছু ক্ষেত্র প্রকাশ করতে পারেন । এটি রেকর্ড সেট ( সংগ্রহ নয় ) যা ক্লায়েন্টরা সাবস্ক্রাইব করে। প্রকাশনা একটি প্রকাশনা ফাংশন দ্বারা করা হয় , যা প্রতিবার নতুন ক্লায়েন্ট সাবস্ক্রাইব করে ডাকা হয় এবং কোন রেকর্ডগুলি প্রত্যাবর্তন করতে হবে (যেমন কোনও ব্যবহারকারীর আইডি, কেবলমাত্র সেই ব্যবহারকারীর নথিগুলি ফিরিয়ে আনতে হবে) তা পরিচালনা করতে প্যারামিটারগুলি নিতে পারে।

  4. ক্লায়েন্টে , আপনার মিনিমঙ্গো সংগ্রহ রয়েছে যা সার্ভার থেকে কিছু রেকর্ড আংশিকভাবে মিরর করে। "আংশিকভাবে" কারণ এগুলিতে কেবলমাত্র কয়েকটি ক্ষেত্র এবং "কিছু রেকর্ড" থাকতে পারে কারণ আপনি সাধারণত ক্লায়েন্টকে কেবলমাত্র প্রয়োজনীয় রেকর্ডগুলি পাঠাতে চান পৃষ্ঠার লোড গতি বাড়িয়ে তুলতে এবং কেবল এটির যা প্রয়োজন এবং এতে অনুমতি রয়েছে অ্যাক্সেস।

    মিনিমোঙ্গো মূলত খাঁটি জাভাস্ক্রিপ্টে মংগোর অবিচল বাস্তবায়ন। এটি একটি স্থানীয় ক্যাশে হিসাবে কাজ করে যা এই ক্লায়েন্টটির সাথে কাজ করা ডাটাবেসের কেবলমাত্র উপসেট সঞ্চয় করে। ক্লায়েন্টের অনুসন্ধানগুলি (সন্ধান করুন) সার্ভারের সাথে কথা না বলেই এই ক্যাশে থেকে সরাসরি পরিবেশন করা হয়।

    এই মিনিমোঙ্গো সংগ্রহগুলি প্রাথমিকভাবে খালি। তারা দ্বারা পূরণ করা হয়

    Meteor.subscribe('record-set-name')
    

    কল। নোট করুন যে সাবস্ক্রাইব করতে পরামিতি কোনও সংগ্রহের নাম নয়; এটি একটি রেকর্ড সেটের নাম যা publishকলটিতে সার্ভারটি ব্যবহার করেছিল । subscribe()কলের জন্য একটি ক্লায়েন্ট সদস্যতা রেকর্ড সেট সব (যেমন সাম্প্রতিকতম 100 ব্লগ পোস্ট) সার্ভারে সংগ্রহ থেকে রেকর্ডগুলির একটি সাবসেট, অথবা একটি (শুধুমাত্র যেমন প্রতিটি রেকর্ডের ক্ষেত্রের উপসেট - titleএবং date)। মিনিমোঙ্গো কীভাবে জানবেন যে আগত রেকর্ডগুলি রাখবেন কোন সংগ্রহের মধ্যে? সংগ্রহের নাম হবে collectionপ্রকাশ হ্যান্ডলার এর ব্যবহৃত যুক্তি added, changedএবং removedcallbacks, অথবা যদি ঐ (যে ক্ষেত্রে অধিকাংশ সময় হয়) অনুপস্থিত, এটা সার্ভারে MongoDB সংগ্রহ নাম হবে।

রেকর্ড সংশোধন করা হচ্ছে

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

একাধিক সাবস্ক্রিপশন

আপনি সদস্যতাগুলি একটি গুচ্ছ যে বিভিন্ন রেকর্ডে টান, কিন্তু তারা সব একই সংগ্রহে ক্লায়েন্টের শেষ করব যদি সার্ভারে একই সংগ্রহ, তাদের উপর ভিত্তি করে থেকে এসেছিলেন থাকতে পারে _id। এটি পরিষ্কারভাবে ব্যাখ্যা করা হয়নি, তবে উল্কা ডক্স দ্বারা বোঝানো হয়েছে:

আপনি যখন কোনও রেকর্ড সেটে সাবস্ক্রাইব করেন, এটি সার্ভারকে ক্লায়েন্টকে রেকর্ড পাঠাতে বলে। ক্লায়েন্ট দোকানে স্থানীয় Minimongo সংগ্রহের এই রেকর্ড, নামেই collectionব্যবহৃত যুক্তি হ্যান্ডলার এর প্রকাশ added, changedএবং removedcallbacks। মিলটি সংগ্রহের নাম সহ ক্লায়েন্টে মঙ্গো.ক্লেশনটি ঘোষণা না করা পর্যন্ত উল্কার আগত বৈশিষ্ট্যগুলিকে সারি করা হবে।

কি ব্যাখ্যা না কি যখন আপনি হয় না স্পষ্টভাবে ব্যবহার added, changedএবং removedযা অধিকাংশ সময় হয় - বা সব সময়ে হ্যান্ডেলার প্রকাশ করুন। এই সর্বাধিক সাধারণ ক্ষেত্রে, সংগ্রহটি যুক্তিটি (আশ্চর্যজনকভাবে) মঙ্গোডিবি সংগ্রহের নাম থেকে নেওয়া হয়েছে যা আপনি প্রথম ধাপে সার্ভারে ঘোষণা করেছিলেন But তবে এর অর্থ হ'ল আপনার বিভিন্ন নামের সাথে বিভিন্ন প্রকাশনা এবং সাবস্ক্রিপশন থাকতে পারে এবং সমস্ত রেকর্ডগুলি ক্লায়েন্টের একই সংগ্রহের মধ্যে শেষ হবে। শীর্ষ স্তরের ক্ষেত্রের স্তর পর্যন্ত , উল্কি নথিগুলির মধ্যে একটি সেট ইউনিয়ন সম্পাদনের যত্ন নেন, যেমন সাবস্ক্রিপশনগুলি ওভারল্যাপ করতে পারে - বিভিন্ন শীর্ষ স্তরের ক্ষেত্রগুলি ক্লায়েন্টের পাশাপাশি পাশাপাশি ক্লায়েন্টের কাছে পাঠানো হয়, নথিতে নথিতে সংগ্রহ হবেক্ষেত্র দুটি সেট ইউনিয়ন

উদাহরণ: একাধিক সাবস্ক্রিপশন ক্লায়েন্টে একই সংগ্রহ পূরণ করে

আপনার একটি ব্লগপোস্ট সংগ্রহ রয়েছে, যা আপনি সার্ভার এবং ক্লায়েন্ট উভয় ক্ষেত্রে একইভাবে ঘোষণা করেন, যদিও এটি বিভিন্ন জিনিস করে:

BlogPosts = new Mongo.Collection('posts');

ক্লায়েন্টের BlogPostsকাছ থেকে, রেকর্ডগুলি পেতে পারেন:

  1. অতি সাম্প্রতিক 10 ব্লগ পোস্টের সদস্যতা

    // server
    Meteor.publish('posts-recent', function publishFunction() {
      return BlogPosts.find({}, {sort: {date: -1}, limit: 10});
    }
    // client
    Meteor.subscribe('posts-recent');
    
  2. বর্তমান ব্যবহারকারীর পোস্টগুলিতে সাবস্ক্রিপশন

    // server
    Meteor.publish('posts-current-user', function publishFunction() {
      return BlogPosts.find({author: this.userId}, {sort: {date: -1}, limit: 10});
      // this.userId is provided by Meteor - http://docs.meteor.com/#publish_userId
    }
    Meteor.publish('posts-by-user', function publishFunction(who) {
      return BlogPosts.find({authorId: who._id}, {sort: {date: -1}, limit: 10});
    }
    
    // client
    Meteor.subscribe('posts-current-user');
    Meteor.subscribe('posts-by-user', someUser);
    
  3. সর্বাধিক জনপ্রিয় পোস্টে সাবস্ক্রিপশন

  4. ইত্যাদি

এই সমস্ত নথিগুলি সার্ভারে সংগ্রহের postsমাধ্যমে মংগোডিবিতে সংগ্রহ থেকে আসে এবং ক্লায়েন্টের সংগ্রহ থেকে BlogPostsশেষ BlogPostsহয়।

এখন আমরা বুঝতে পারি যে কেন আপনাকে find()একাধিকবার কল করতে হবে - দ্বিতীয়বার ক্লায়েন্টের উপরে থাকা কারণ সমস্ত সাবস্ক্রিপশন থেকে দস্তাবেজগুলি একই সংগ্রহের মধ্যে শেষ হবে এবং আপনার কেবল যত্নশীলদেরই এনে নেওয়া দরকার। উদাহরণস্বরূপ, ক্লায়েন্টে সর্বাধিক সাম্প্রতিক পোস্টগুলি পেতে, আপনি কেবল সার্ভার থেকে কোয়েরিটি মিরর করুন:

var recentPosts = BlogPosts.find({}, {sort: {date: -1}, limit: 10});

এটি শীর্ষস্থানীয় পোস্ট এবং ব্যবহারকারীর পোস্ট উভয়ই ক্লায়েন্টকে প্রাপ্ত সমস্ত নথি / রেকর্ডগুলিতে একটি কার্সার ফিরিয়ে দেবে। ( ধন্যবাদ জেফ্রি )


10
এটা অসাধারণ. BlogPosts.find({})উভয় প্রকাশনার সাবস্ক্রাইব করার পরে আপনি যদি ক্লায়েন্টের উপর এমনটি করেন তবে সম্ভবত এটি উল্লেখযোগ্য হবে — যেমন এটি বর্তমানে ক্লায়েন্টের সমস্ত নথি / রেকর্ডের একটি কার্সার প্রদান করবে, শীর্ষ পোস্ট এবং ব্যবহারকারীর পোস্ট উভয়ই। আমি এসও তে অন্যান্য প্রশ্ন দেখেছি যেখানে প্রশ্নকর্তা এতে বিভ্রান্ত হয়েছিলেন।
জেফ্রি বুথ

4
এটা অসাধারণ. ধন্যবাদ এছাড়াও, মেটিয়ার.উউসার্স () সংগ্রহটি ক্লায়েন্টের পক্ষে স্বয়ংক্রিয়ভাবে প্রকাশিত হওয়ায় একটি বিভ্রান্তিকর সৃষ্টি করে। ব্যবহারকারীদের () সংগ্রহটি বর্ণনা করার জন্য উপরের উত্তরে কিছুটা যুক্ত করা যেতে পারে?
জিমি এমজি লিম

4
এমনকি যদি প্রাথমিকভাবে জিজ্ঞাসা করা হয় তার চেয়েও অনেক বেশি আমার মনে হয় @ ডিভিজির এই দুর্দান্ত লেখাকে গ্রহণযোগ্য উত্তর হিসাবে চিহ্নিত করা উচিত। ধন্যবাদ ড্যান
ফিজিওকোডার

4
ধন্যবাদ @ ড্যানডাসকলেসকু, দুর্দান্ত ব্যাখ্যা যা আমার জন্য অনেকটা সাফ করে দিয়েছে, আপনার ব্যাখ্যাটি পড়ার পরে "সংগ্রহ" সম্পর্কে উল্কা ডক্স অনুসরণ করার পরে আমি মনে করি যে BlogPostsএটি কোনও সংগ্রহ নয়, এটির ফিরে আসা অবজেক্টে "সন্নিবেশ", "আপডেটের মতো পদ্ধতি রয়েছে ".. ইত্যাদি, এবং আসল সংগ্রহটি postsক্লায়েন্ট এবং সার্ভারেও রয়েছে।
ইউএক্সই

4
আপনি সাবস্ক্রাইব করেছেন এমন রেকর্ড সংস্থার জন্যই কি কল করা সম্ভব? যেমনটি রয়েছে, স্থানীয়ভাবে মিনিমঙ্গো ডিবি অনুসন্ধানের পরিবর্তে, আমার জাভাস্ক্রিপ্টে রেকর্ড সেটটি সরাসরি পাওয়া সম্ভব?
জিমি নট

27

হ্যাঁ, ক্লায়েন্ট-সাইড সন্ধান () কেবল মিনিমোঙ্গোর ক্লায়েন্টে থাকা নথিগুলি ফিরিয়ে দেয়। ডক্স থেকে :

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

আপনি যেমনটি বলেছেন, প্রকাশ () ক্লায়েন্টের কাছে কী নথি থাকবে তা নির্দিষ্ট করে।


1

এখানে বেসিক থাম্ব রুল publishএবং subscribedভেরিয়েবলের নাম ক্লায়েন্ট এবং সার্ভারের পাশে একই হওয়া উচিত।

মঙ্গো ডিবি এবং ক্লায়েন্টের পক্ষে সংগ্রহের নাম একই হওয়া উচিত।

ধরে নিন যে আমি প্রকাশিত ব্যবহার করছি এবং employeesতারপরে কোডটির মতো আমার সংগ্রহের জন্য সাবস্ক্রাইব করছি code


সার্ভার সাইড

এখানে varকীওয়ার্ডের ব্যবহার alচ্ছিক (এই ফাইলটিকে সংগ্রহটি স্থানীয় করার জন্য এই কীওয়ার্ডটি ব্যবহার করুন)।

CollectionNameOnServerSide = new Mongo.Collection('employees');   

Meteor.publish('employeesPubSub', function() { 
    return CollectionNameOnServerSide.find({});     
});

ক্লায়েন্ট পাশ .js ফাইল

CollectionNameOnClientSide = new Mongo.Collection('employees');
var employeesData = Meteor.subscribe('employeesPubSub');

Template.templateName.helpers({
  'subcribedDataNotAvailable' : function(){
        return !employeesData.ready();
    },
   'employeeNumbers' : () =>{
       CollectionNameOnClientSide.find({'empId':1});
  }
});

ক্লায়েন্ট পাশ। এইচটিএমএল ফাইল

এখানে আমরা subcribedDataNotAvailableক্লায়েন্টের পক্ষে ডেটা প্রস্তুত কিনা তা জানতে হেল্পার পদ্ধতিটি ব্যবহার করতে পারি , যদি ডেটা প্রস্তুত থাকে তবে employeeNumbersসহায়ক পদ্ধতি ব্যবহার করে কর্মচারীর সংখ্যা মুদ্রণ করুন ।

<TEMPLATE name="templateName">
{{#if subcribedDataNotAvailable}}
   <h1> data loading ... </h1>
 {{else}}
  {{#each employeeNumbers }}
     {{this}}
  {{/each}}
 {{/if}}
<TEMPLATE>

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