কেন মঙ্গুজের স্কিমা এবং মডেল দুটি রয়েছে?


94

দুটি ধরণের অবজেক্ট একে অপরের কাছাকাছি বলে মনে হয় যে উভয়কেই অপ্রয়োজনীয় মনে হয়। স্কিমা এবং মডেল উভয়ই থাকার মানে কী ?

উত্তর:


61

প্রায়শই এই ধরণের প্রশ্নের উত্তর দেওয়ার সবচেয়ে সহজ উপায় একটি উদাহরণ সহ। এই ক্ষেত্রে, কেউ ইতিমধ্যে আমার জন্য এটি সম্পন্ন করেছে :)

এখানে একবার দেখুন:

http://rawberg.com/blog/nodejs/mongoose-orm-nested-models/

সম্পাদনা: মূল পোস্টটি (মন্তব্যে উল্লিখিত হিসাবে) মনে হচ্ছে আর বিদ্যমান নেই, তাই আমি নীচে এটি পুনরুত্পাদন করছি। এটি কখনই ফিরে আসা উচিত, বা যদি এটি সবে সরে গেছে, দয়া করে আমাকে জানান।

এটি মঙ্গুজে মডেলগুলির মধ্যে স্কিমার ব্যবহার এবং কেন আপনি এটি করতে চান তা সম্পর্কে একটি সুনির্দিষ্ট বর্ণনা দেয় এবং স্কিমার কাঠামো সম্পর্কিত সমস্ত কিছুর পাশাপাশি আপনাকে মডেলটির মাধ্যমে কীভাবে কার্যগুলি ঠেকানো যায় তাও দেখায়

আসল পোস্ট:

আসুন কোনও মডেলের অভ্যন্তরে স্কিমা এম্বেড করার একটি সহজ উদাহরণ দিয়ে শুরু করা যাক।

var TaskSchema = new Schema({
    name: String,
    priority: Number
});

TaskSchema.virtual('nameandpriority')
    .get( function () {
        return this.name + '(' + this.priority + ')';
    });

TaskSchema.method('isHighPriority', function() {
    if(this.priority === 1) {
        return true;
    } else {
        return false;
    }
}); 

var ListSchema = new Schema({
    name: String,
    tasks: [TaskSchema]
});

mongoose.model('List', ListSchema);

var List = mongoose.model('List');

var sampleList = new List({name:'Sample List'});

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

isHighPriorityএই সেটআপটির সাথে পদ্ধতিগুলি কীভাবে কাজ করে তা প্রদর্শন করার জন্য আমি একটি সাধারণ টাস্ক পদ্ধতিও সংজ্ঞায়িত করেছি ।

ইন ListSchemaসংজ্ঞা কেমন কর্ম কী একটি অ্যারের রাখা কনফিগার করা বিজ্ঞপ্তি পাবেন TaskSchemaবস্তু। কার্য কীটি এমন একটি দৃষ্টান্ত হয়ে উঠবে DocumentArrayযা এম্বেড থাকা মঙ্গো নথিগুলি মোকাবেলার জন্য বিশেষ পদ্ধতি সরবরাহ করে।

আপাতত আমি কেবলমাত্র ListSchemaবস্তুটি মঙ্গুজ.মোডেলে পাস করেছি এবং টাস্কশেমাকে বাইরে রেখেছি। প্রযুক্তিগতভাবে এটিকে TaskSchemaএকটি আনুষ্ঠানিক মডেলে পরিণত করার প্রয়োজন নেই কারণ আমরা এটি নিজস্ব সংগ্রহের মধ্যে সংরক্ষণ করব না। পরে আমি আপনাকে দেখাচ্ছি যে আপনি যদি এটি করেন তবে এটি কোনও কিছুর ক্ষতি করে না এবং এটি আপনার সমস্ত মডেলগুলিকে একইভাবে সংগঠিত করতে সহায়তা করতে পারে বিশেষত যখন তারা একাধিক ফাইল ছড়িয়ে দেওয়া শুরু করে।

সঙ্গে Listমডেল সেটআপ এর এটি একটি দম্পতি কর্ম যোগ করতে পারেন এবং তাদের রক্ষা মোঙ্গো যাক।

var List = mongoose.model('List');
var sampleList = new List({name:'Sample List'});

sampleList.tasks.push(
    {name:'task one', priority:1}, 
    {name:'task two', priority:5}
);

sampleList.save(function(err) {
    if (err) {
        console.log('error adding new list');
        console.log(err);
    } else {
        console.log('new list successfully saved'); 
    }
});

আমাদের Listমডেল ( simpleList) এর উদাহরণে কার্য বৈশিষ্ট্যগুলি নিয়মিত জাভাস্ক্রিপ্ট অ্যারের মতো কাজ করে এবং আমরা পুশ ব্যবহার করে এতে নতুন কার্যগুলি যুক্ত করতে পারি। গুরুত্বপূর্ণ বিষয়টি লক্ষ্য করা হ'ল কাজগুলি নিয়মিত জাভাস্ক্রিপ্ট অবজেক্ট হিসাবে যুক্ত করা হয়। এটি একটি সূক্ষ্ম পার্থক্য যা অবিলম্বে স্বজ্ঞাত হতে পারে না।

আপনি মঙ্গো শেল থেকে যাচাই করতে পারেন যে নতুন তালিকা এবং কার্যগুলি মঙ্গোতে সংরক্ষিত হয়েছে।

db.lists.find()
{ "tasks" : [
    {
        "_id" : ObjectId("4dd1cbeed77909f507000002"),
        "priority" : 1,
        "name" : "task one"
    },
    {
        "_id" : ObjectId("4dd1cbeed77909f507000003"),
        "priority" : 5,
        "name" : "task two"
    }
], "_id" : ObjectId("4dd1cbeed77909f507000001"), "name" : "Sample List" }

এখন আমরা এর কাজগুলি ObjectIdটানতে Sample Listএবং পুনরাবৃত্তি করতে ব্যবহার করতে পারি use

List.findById('4dd1cbeed77909f507000001', function(err, list) {
    console.log(list.name + ' retrieved');
    list.tasks.forEach(function(task, index, array) {
        console.log(task.name);
        console.log(task.nameandpriority);
        console.log(task.isHighPriority());
    });
});

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

List.findById('4dd1cbeed77909f507000001', function(err, list) {
    console.log(list.name + ' retrieved');
    list.tasks.forEach(function(task, index, array) {
        console.log(task.name);
        console.log(task.nameandpriority);
        console.log(task._schema.methods.isHighPriority.apply(task));
    });
});

যদি আপনি এই কোডটি চালান তবে আপনার কমান্ড লাইনে নিম্নলিখিত আউটপুটটি দেখতে হবে।

Sample List retrieved
task one
task one (1)
true
task two
task two (5)
false

সেই চারপাশের কাজের কথা মাথায় রেখে আসুন TaskSchemaএটিকে একটি মঙ্গুজ মডেলে পরিণত করি ।

mongoose.model('Task', TaskSchema);

var Task = mongoose.model('Task');

var ListSchema = new Schema({
    name: String,
    tasks: [Task.schema]
});

mongoose.model('List', ListSchema);

var List = mongoose.model('List');

TaskSchemaসংজ্ঞা আগে তা আমি এটা বাদ সমান। এটির মডেল হয়ে যাওয়ার পরে আমরা ডট নোটেশন ব্যবহার করে এর অন্তর্নিহিত স্কিমা অবজেক্টটি অ্যাক্সেস করতে পারি।

আসুন একটি নতুন তালিকা তৈরি করুন এবং এর মধ্যে দুটি টাস্ক মডেল দৃষ্টান্ত এম্বেড করুন।

var demoList = new List({name:'Demo List'});

var taskThree = new Task({name:'task three', priority:10});
var taskFour = new Task({name:'task four', priority:11});

demoList.tasks.push(taskThree.toObject(), taskFour.toObject());

demoList.save(function(err) {
    if (err) {
        console.log('error adding new list');
        console.log(err);
    } else {
        console.log('new list successfully saved'); 
    }
});

আমরা যেমন টাস্ক মডেল দৃষ্টান্তগুলি তালিকায় এম্বেড করে যাচ্ছি আমরা প্রত্যাশা করছি toObjectতাদের সরল জাভাস্ক্রিপ্ট অবজেক্টগুলিতে তাদের ডেটা রূপান্তর করতে অনুরোধ করছি List.tasks DocumentArray। আপনি যখন মডেল দৃষ্টান্তগুলি সংরক্ষণ করেন তখন আপনার এম্বেড থাকা নথিগুলি এতে থাকবে ObjectIds

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


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

4
সম্পন্ন - এটি এখনও গুগল ক্যাশে ছিল, তাই তুলনামূলকভাবে সহজ
অ্যাডাম কমারফোর্ড

4
রেকর্ডের জন্য, এমবেডড
ডাকোটা

4
আমি কারও প্যারেডে বৃষ্টির চেষ্টা করছি না, তবে এই উত্তরটি টিউটোরিয়ালের মতো আরও পড়ুন: কীভাবে উত্তর দিচ্ছেন, তবে কেন নয়। : থাকার কম সম্মত ভোট সত্ত্বেও, আমি নিম্নলিখিত উত্তর অনেক বেশি সহায়ক বলে চিহ্নিত করেছেন stackoverflow.com/a/22950402/26331
aaaidan

4
আমি উত্তরটি দেখেছি (এবং এটি উত্সাহিত), এর উত্তর দেওয়া হয়েছিল এবং তার আগে 2 বছর ধরে এটি গৃহীত হয়েছিল। আমি খুশি যে এর থেকে আরও ভাল উত্তর পাওয়া যাবে, কারও কুচকাওয়াজ নিয়ে বৃষ্টি হচ্ছে না এবং ফেব্রুয়ারী ২০১৫ সাল থেকে প্রশ্নের মন্তব্যে আপনি যে উত্তরের উল্লেখ করেছেন তার সাথে একটি লিঙ্ক তৈরি হয়েছে তাই আমি এটিকে নিজের সাথে সংযুক্ত করার প্রয়োজন বোধ করি না
অ্যাডাম কমারফোর্ড

54

স্কিমা এমন একটি বস্তু যা আপনার মঙ্গোডিবি সংগ্রহে সংরক্ষণ করা হবে এমন কোনও দস্তাবেজের কাঠামোর সংজ্ঞা দেয়; এটি আপনাকে আপনার সমস্ত ডেটা আইটেমের জন্য ধরণ এবং বৈধতা নির্ধারণ করতে সক্ষম করে।

মডেল এমন একটি বস্তু যা আপনাকে একটি নামকৃত সংগ্রহে সহজে অ্যাক্সেস দেয়, আপনাকে সংগ্রহটি জিজ্ঞাসা করার অনুমতি দেয় এবং সেই সংগ্রহে আপনি যে কোনও দস্তাবেজ সংরক্ষণ করেছেন সেগুলি যাচাই করতে স্কিমা ব্যবহার করুন। এটি একটি স্কিমা, একটি সংযোগ এবং সংগ্রহের নাম সংযুক্ত করে তৈরি করা হয়েছে।

মূলত ভ্যালারি কারপভ, মঙ্গোডিবি ব্লগের দ্বারা বাক্যযুক্ত


5

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

একটি কারণ আমি বুঝতে পেরেছিলাম যে মঙ্গুজ স্কিমাটি আলাদা করবে এবং মডেল এমন উদাহরণ যেখানে আপনি দুটি স্কিমা থেকে একটি মডেল তৈরি করতে চান। এই জাতীয় পরিস্থিতি পরিচালনার চেয়ে আরও জটিলতার পরিচয় দিতে পারে - যদি আপনার কাছে দুটি মডেল দ্বারা পরিচালিত দুটি স্কিমা থাকে তবে সেগুলি কেন একটি স্কিমা নয়?

সম্ভবত আসল প্রশ্নটি theতিহ্যবাহী রিলেশনাল ডাটাবেস সিস্টেমের আরও একটি প্রতীক। বিশ্বের নোএসকিউএল / মঙ্গো বিশ্বে স্কিমাটি মাইএসকিউএল / পোস্টগ্রিসএসকিউএল থেকে কিছুটা নমনীয় এবং এইভাবে স্কিমা পরিবর্তন করা আরও সাধারণ অনুশীলন।


যেমন স্কিমা বনাম মডেলটি নিজেকে পুনরাবৃত্তি করার পক্ষে যথেষ্ট ছিল না, আপনি কোনও ম্যাচিং টাইপস্ক্রিপ্ট ইন্টারফেস বজায় রাখার চেষ্টা করার সময় আরও নকল করতে চলেছেন এবং গ্রাফকিউএল স্কিমা তৈরি করার সময় আরও বেশি।
ড্যান ড্যাসক্লেস্কু

0

কেন বুঝতে হবে? বুঝতে হবে আসলে মঙ্গুজ আসলে কী?

ঠিক আছে, মঙ্গুজ হ'ল মোংগোডিবি এবং নোড জেএসের জন্য একটি অবজেক্ট ডেটা মডেলিংয়ের গ্রন্থাগার, এটি উচ্চ স্তরের বিমূর্ততা সরবরাহ করে। সুতরাং এটি এক্সপ্রেস এবং নোডের সম্পর্কের মতো কিছুটা, তাই এক্সপ্রেসটি নিয়মিত নোডের উপরে বিমূর্ততার একটি স্তর, যখন মঙ্গুজ নিয়মিত মোংগোডিবি ড্রাইভারের বিমূর্ততার একটি স্তর a

একটি অবজেক্ট ডেটা মডেলিং লাইব্রেরি জাভাস্ক্রিপ্ট কোড লেখার কেবল আমাদের জন্য একটি উপায় যা এরপরে একটি ডাটাবেসের সাথে ইন্টারেক্ট করবে। সুতরাং আমরা আমাদের ডাটাবেস অ্যাক্সেস করার জন্য একটি নিয়মিত মঙ্গোডিবি ড্রাইভার ব্যবহার করতে পারি, এটি ঠিক কাজ করবে।

তবে এর পরিবর্তে আমরা মঙ্গুজ ব্যবহার করি কারণ এটি আমাদের অ্যাপ্লিকেশনগুলির দ্রুত এবং সহজ বিকাশের জন্য মেশিনটি বাইরে অনেক বেশি কার্যকারিতা দেয়।

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

মঙ্গুজে একটি স্কিমা হ'ল যেখানে আমরা আমাদের ডেটা মডেল করি, যেখানে আমরা ডেটার কাঠামো, ডিফল্ট মান এবং বৈধতা বর্ণনা করি, তারপরে আমরা সেই স্কিমাটি গ্রহণ করি এবং এটির বাইরে একটি মডেল তৈরি করি, একটি মডেল মূলত স্কিমার চারপাশে একটি মোড়ক, যা ডকুমেন্ট তৈরি করতে, মুছতে, আপডেট করতে এবং পড়ার জন্য আমাদেরকে ডাটাবেসের সাথে আসলে ইন্টারফেস করতে দেয়।

এখানে চিত্র বর্ণনা লিখুন

একটি স্কিমা থেকে একটি মডেল তৈরি করা যাক।

const tourSchema = new mongoose.Schema({
  name: {
    type: String,
    required: [true, 'A tour must have a name'],
    unique: true,
  },
  rating: {
    type: Number,
    default: 4.5,
  },
  price: {
    type: Number,
    required: [true, 'A tour must have a price'],
  },
});
//tour model
const Tour = mongoose.model('Tour', tourSchema);

কনভেশন অনুযায়ী একটি মডেল নামের প্রথম অক্ষর অবশ্যই মূলধন করা উচিত।

আসুন আমরা আমাদের মডেলটির উদাহরণ তৈরি করি যা আমরা মঙ্গুজ এবং স্কিমা ব্যবহার করে তৈরি করেছি। এছাড়াও, আমাদের ডাটাবেসের সাথে যোগাযোগ করুন।

const testTour = new Tour({ // instance of our model
  name: 'The Forest Hiker',
  rating: 4.7,
  price: 497,
});
 // saving testTour document into database
testTour
  .save()
  .then((doc) => {
    console.log(doc);
  })
  .catch((err) => {
    console.log(err);
  });

সুতরাং স্কামা এবং মডেল মঙ্গস উভয়ই থাকার ফলে আমাদের জীবন সহজ হয়।

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