মঙ্গুজ - এক্সিকিউটিভ ফাংশনটি কী করে?


103

আমি মঙ্গুজ কোডের এক টুকরো জুড়ে এসেছি যার মধ্যে একটি কোয়েরি ফাইন্ডওন এবং তারপরে একটি এক্সিকিউট () ফাংশন অন্তর্ভুক্ত রয়েছে।

আমি জাভাস্ক্রিপ্টে এর আগে কখনও সে পদ্ধতিটি দেখিনি? এটা ঠিক কি করে?

উত্তর:


150

মূলত মঙ্গুজ ব্যবহার করার সময়, সহায়কগুলি ব্যবহার করে নথিগুলি পুনরুদ্ধার করা যেতে পারে। ক্যোয়ারী শর্তাদি গ্রহণ করে এমন প্রতিটি মডেল পদ্ধতি কোনও callbackবা execপদ্ধতির মাধ্যমে কার্যকর করা যেতে পারে ।

callback:

User.findOne({ name: 'daniel' }, function (err, user) {
  //
});

exec:

User
  .findOne({ name: 'daniel' })
  .exec(function (err, user) {
      //
  });

সুতরাং আপনি যখন কলব্যাক পাস না করেন আপনি একটি ক্যোয়ারী তৈরি করতে পারেন এবং শেষ পর্যন্ত এটি কার্যকর করতে পারেন।

আপনি অতিরিক্ত তথ্য খুঁজে পেতে পারেন মঙ্গুজ ডক্সে

হালনাগাদ

মোঙ্গুজ অ্যাসিঙ্ক অপারেশনের সাথে সংমিশ্রণে প্রতিশ্রুতি ব্যবহার করার সময় লক্ষ্য করার মতো বিষয়টি মঙ্গুসের অনুসন্ধানগুলি প্রতিশ্রুতি নয় । অনুসন্ধানগুলি একটি তাত্ক্ষণিক ফিরিয়ে দেয় তবে আপনার যদি সত্যিকারের প্রতিশ্রুতির প্রয়োজন হয় তবে আপনার execপদ্ধতিটি ব্যবহার করা উচিত । আরও তথ্য এখানে পাওয়া যাবে

আপডেটের সময় আমি লক্ষ্য করেছি যে আমি স্পষ্টভাবে প্রশ্নের উত্তর দিলাম না:

আমি জাভাস্ক্রিপ্টে এর আগে কখনও সে পদ্ধতিটি দেখিনি? এটা ঠিক কি করে?

ওয়েল এটা না একটি নেটিভ জাভাস্ক্রিপ্ট পদ্ধতি, কিন্তু নকুল API- এর অংশ।


4
যদি আমি মঙ্গুজ সেট করে রেখেছি .প্রাইমস = প্রয়োজন ('ব্লুবার্ড'), তখনও আমার কি .exec () ব্যবহার করা দরকার? ধন্যবাদ
ওয়েফথিউফিউশন

4
@ ওয়েফথফিউচার আমি ডক্সকে সত্যই এই বিষয় সম্পর্কে বিভ্রান্ত মনে করি, তবে আমি বিশ্বাস করি যে আপনাকে এখনও execপদ্ধতিটি কল করতে হবে । তারা ডকসনে কমপক্ষে এটি করে। নিশ্চিত হয়ে আপনি নিজের সাথে চেক করতে পারেন Model.find() instanceof require('bluebird')। আশাকরি এটা সাহায্য করবে.
ড্যানিলুজ

4
এবং তারপরে অন্যান্য ক্রিয়াকলাপ যেমন ডিলিট এবং ইনসার্টম্যানের প্রশ্ন রয়েছে ... এই ক্ষেত্রে মৃত্যুদণ্ড কার্যকর করা () প্রয়োজন হবে?
মুছতে

4
এক্সিকিউট একটি প্রতিশ্রুতিও দেয়, যদি কোনও কলব্যাক পাস না হয় তবে এটি খুব সুবিধাজনক আমাকে অবশ্যই বলতে হবে
আলেকজান্ডার মিলস

এটি কাউকে বাঁচাতে পারে । আপনি যদি ভাবেন যে Model.update () এর কাজটি করবে এবং কিছু অত-গুরুত্বপূর্ণ তথ্য আপডেট হওয়ার অপেক্ষায় না থাকে এবং এপিআইতে প্রতিক্রিয়া ফিরে আসে; আপনার আপডেট কার্যকর হবে না। Model.update().exec()এটি কার্যকর করা হবে তা আপনার নিশ্চিত করা দরকার । তারপরে আপনি আপডেটের জন্য অপেক্ষা না করে এপিআইকে প্রতিক্রিয়া জানাতে পারেন।
যোগেশ

52

ড্যানিয়েল এর সুন্দর উত্তর দিয়েছেন। ক্যোয়ারীগুলি তৈরি ও সম্পাদন করার উপায়গুলির বিশদ তালিকার বিশদটি জানাতে, নিম্নলিখিত ব্যবহারের ক্ষেত্রে দেখুন:

অনুসন্ধান বিল্ডিং

নকুল পর্যন্ত একটি ক্যোয়ারী নির্বাহ করা হবে না thenবা execএটি উপর বলা হয়েছে। জটিল প্রশ্নগুলি তৈরি করার সময় এটি খুব দরকারী। কিছু উদাহরণের মধ্যে populateএবং aggregateকার্যাদি অন্তর্ভুক্ত থাকতে পারে ।

User.find({name: 'John'}) // Will not execute

কলব্যাকের মাধ্যমে কার্যকর করা

যদিও তার নেস্টিং প্রকৃতির কারণে অনেকের দ্বারা অপছন্দ করা হয়েছে, quচ্ছিক কলব্যাক সরবরাহ করে কোয়েরিগুলি সম্পাদন করা যেতে পারে।

User.find({name: 'John'}, (err, res) => {}) // Will execute

তারপরে এপিআই প্রতিশ্রুতি হিসাবে / এ +

মঙ্গুজের অনুসন্ধানগুলি একটি thenফাংশন সরবরাহ করে। এটি নিয়মিত প্রতিশ্রুতি দিয়ে বিভ্রান্ত হবে না। সোজা কথায়, প্রতিশ্রুতি / এ + নির্দিষ্টকরণের জন্য thenআমরা যেমন প্রতিশ্রুতি দিয়ে থাকি সেভাবে কাজ করার জন্য একটি ফাংশন প্রয়োজন ।

User.find({name: 'John'}).then(); // Will execute
Promise.all([User.find({name: 'John'}), User.find({name: 'Bob'})]) // Will execute all queries in parallel

এক্সিকিউটিভ ফাংশন

মঙ্গুজ ডক্স থেকে If you need a fully-fledged promise, use the .exec() function.

User.find({name: 'John'}).exec(); // Will execute returning a promise

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

উপরে উল্লিখিত হিসাবে, আপনি thenএকটি প্রতিশ্রুতিও ফেরত দিতে একটি প্রশ্নের উপরে ব্যবহার করতে পারেন । এটি এর চেয়ে আলাদা নয় exec। ব্যবহারের ক্ষেত্রে আমি এই সহজটি খুঁজে পাই এরকম কিছু ব্যবহার করার সময় Promise.allexecযদিও প্রতিশ্রুতি এই ধরনের প্রসঙ্গে কাজ করে কিনা তা নিশ্চিত নয় ।
আনশুল কোকা

আপনি কি দয়া করে .exec () এর সাথে একটি সম্পূর্ণ উদাহরণ যুক্ত করতে পারেন? @ আংশুলকোকা এটি কি যে .exec () স্বয়ংক্রিয়ভাবে কোয়েরিটিকে অবিচ্ছিন্ন করে তোলে বা আমার
এসিঙ্ক

প্রশ্নটি অ্যাসিঙ্ক্রোনাস তৈরি করার জন্য অ্যাসিঙ্ক / অপেক্ষা করতে হবে তাই আমি নিশ্চিত না যে আমি প্রশ্নটি বুঝতে পেরেছি। সম্পূর্ণ উদাহরণের জন্য আপনার অনুরোধের জন্য কেবলমাত্র উপসর্গটি আমার উদাহরণটির জন্য অপেক্ষা করুন।
আনশুল কোকা

8

exec()কোনও কলব্যাক সরবরাহ না করা হলে একটি প্রতিশ্রুতি ফিরিয়ে দেবে। সুতরাং নিম্নলিখিত প্যাটার্নটি খুব সুবিধাজনক এবং জেনেরিক - এটি কলব্যাকগুলি বা দুর্দান্ত প্রতিশ্রুতিগুলি পরিচালনা করতে পারে:

function findAll(query, populate, cb) {

  let q = Response.find(query);

  if (populate && populate.length > 0) {
    q = q.populate(populate);
  }

  // cb is optional, will return promise if cb == null
  return q.lean().exec(cb);

}

আমি মঙ্গুজের সাথে ব্লুবার্ড প্রতিশ্রুতি ব্যবহার করার পরামর্শ দিচ্ছি, এটি করার জন্য, এই কলটি ব্যবহার করুন:

const mongoose = require('mongoose');
mongoose.Promise = require('bluebird');

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