মঙ্গুজ সাব-ডকুমেন্টস বনাম নেস্টেড স্কিমা


122

আমার মূল স্কিমায় একটি গভীর স্তর বনাম সাব-ডকুমেন্টগুলি ব্যবহার করার পক্ষে এবং কৌশলগুলি সম্পর্কে আমি আগ্রহী:

var subDoc = new Schema({
  name: String
});

var mainDoc = new Schema({
  names: [subDoc]
});

অথবা

var mainDoc = new Schema({
  names: [{
    name: String
 }]
});

আমি বর্তমানে সর্বত্র সাবডোক ব্যবহার করছি তবে আমি প্রাথমিকভাবে পারফরম্যান্স বা আমার মুখোমুখি হতে পারে এমন সমস্যা সম্পর্কে জিজ্ঞাসা করছি।


আমি আপনাকে এই উত্তরটি টাইপ করার চেষ্টা করছিলাম, তবে কীভাবে তা পেলাম না। কিন্তু এখানে কটাক্ষপাত দিতে mongoosejs.com/docs/subdocs.html
gustavohenke

: এখানে MongoDB বিবেচনার সম্পর্কে ভালো সাড়া যখন আপনার ডাটাবেস স্কিমা তৈরি নিজেকে জিজ্ঞাসা করা হয় stackoverflow.com/questions/5373198/...
anthonylawson

আপনি বোঝাতে চেয়েছিলেন যে এটির _idক্ষেত্রটিও বর্ণনা করা দরকার ? মানে, এটি সক্ষম হলে কিণ্ডা স্বয়ংক্রিয় নয়?
ভাদোরকোয়েস্ট

_idউপকেন্দ্রের ক্ষেত্রটি অনন্য কিনা কেউ জানেন ? (ওপির প্রশ্নে দ্বিতীয় উপায়ে ব্যবহার করে তৈরি করা হয়েছে)
সায়তমা

উত্তর:


72

ডক্স অনুসারে , এটি ঠিক একই রকম। তবে, স্কিমা ব্যবহার করলে _idক্ষেত্রও যুক্ত হবে (যতক্ষণ না আপনার সেই অক্ষম থাকে না), এবং সম্ভবত সাবডকগুলি ট্র্যাক করার জন্য আরও কিছু সংস্থান ব্যবহার করা উচিত।

বিকল্প ঘোষণার বাক্য গঠন

ভি 3-তে নতুন যদি আপনার সাব-ডকুমেন্ট স্কিমা উদাহরণটিতে অ্যাক্সেসের প্রয়োজন না হয় তবে আপনি কেবল কোনও অবজেক্ট ল্যাটারাল পাস করে সাব ডক্স ঘোষণা করতে পারেন [...]


1
তবে আমি এই চেষ্টা করেছিলাম। সাব ডকুমেন্টের ডেটা আলাদা সংগ্রহে কেন সংরক্ষণ করা হয় না। এটি সর্বদা মেইনডক সংগ্রহের ভিতরে সঞ্চয় করে।
ফিজার খান

17
সাব ডকুমেন্টগুলি এইভাবে কাজ করে। তারা নথির ভিতরে এম্বেড করছে। মঙ্গুজের সাথে খেলার আগে নিশ্চিত হয়ে নিন যে আপনি অন্তর্নিহিত মঙ্গোডিবি বুঝতে পেরেছেন।
অ্যান্ডিল

1
স্কিমা যোগ করার _ আইডি সম্পর্কিত, এটি বোধগম্য তবে আমি সাব-ডকসগুলির একটি অ্যারে এবং অবজেক্ট ল্যাটারেলের একটি অ্যারে সহ একটি স্কিমা তৈরি করেছি এবং উভয়টিতে একটি _id যুক্ত করা হয়েছে। আচরণ কি বদলেছে?
ড্রু গুডউইন

@DrewGoodwin দেখে মনে হচ্ছে এটির জন্য একটি যখন এই মত ছিল: stackoverflow.com/questions/17254008/...
cheesemacfly

37

আপনার যদি এমন স্কীমা রয়েছে যা আপনার মডেলের বিভিন্ন অংশে পুনরায় ব্যবহৃত হয়, তবে চাইল্ড ডক্সের জন্য পৃথক স্কিমার সংজ্ঞা দেওয়া কার্যকর হতে পারে যাতে আপনাকে নিজের সদৃশ করতে হবে না।


4
এটি একটি দুর্দান্ত উত্তর। কখনও কখনও আমি আরও একটি মডেলতে সাব-ডকুমেন্ট ব্যবহার করি, বা একটি মডেলটিতে আমার দুটি ক্ষেত্র রয়েছে যা আলাদা করা দরকার, তবে এখনও একই সাবডোকামেন্ট কাঠামো রয়েছে।
মার্টিন হ্যালেন

2
অপ্রয়োজনীয় তথ্য সংরক্ষণের সুবিধাগুলি / অসুবিধাগুলিও বিবেচনা করা উচিত।
স্যাম ভ্লোবার্গস

25

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

আমি আশা করি যে সমাধানগুলি বা সর্বোত্তম অনুশীলনের সন্ধান করছে তাকে সহায়তা করে।

Http://askasya.com/post/largee এমবেডেডরেয়েসে মূল পোস্ট । আপনি তার স্ট্যাকওভারফ্লো প্রোফাইলে https://stackoverflow.com/users/431012/asya-kamsky এ পৌঁছে দিতে পারেন

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

আমি যদি দস্তাবেজে ক্রিয়াকলাপটি এম্বেড করে থাকি তবে এটি প্রথমে দুর্দান্ত কাজ করবে কারণ আমার সমস্ত ক্রিয়াকলাপ ঠিক সেখানে রয়েছে এবং একক পাঠের সাথে আপনি আমাকে যা দেখাতে চান তা ফিরে পেতে পারেন: "আপনি সম্প্রতি এটিতে ক্লিক করেছেন এবং এখানে আপনার শেষ দুটি মন্তব্য কি "তবে ছয় মাস পেরিয়ে যাওয়ার পরে কি ঘটে যায় এবং আমি অনেক দিন আগে আমি যে জিনিসগুলি করেছি সেগুলি সম্পর্কে আমি চিন্তা করি না এবং আমি বিশেষত কোনও পুরানো ক্রিয়াকলাপ অনুসন্ধান করতে না গেলে আপনি সেগুলি আমাকে দেখাতে চান না?

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

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

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

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


3
এটি শীর্ষ উত্তর হওয়া উচিত; এটি টাকার উপর আঘাত। মঙ্গোডিবির নিজস্ব সাদা কাগজপত্রগুলি একই কথা বলেছে।
জে এডওয়ার্ডস

বালতি প্যাটার্ন সম্পর্কে এই নিবন্ধটি Asya সুন্দরভাবে কী সম্পর্কে কথা বলে প্রশংসা করে। mongodb.com/blog/post/building-with-patterns-the-bucket-pattern আমি মনে করি ওপি এর প্রশ্নে subDoc স্কিমা বাকেট প্যাটার্ন সঙ্গে ভাল কাজ করবে।
plong0

13

মূলত, একটি ভেরিয়েবল তৈরি করুন nestedDovএবং এটি এখানে রাখুনname: [nestedDov]

সাধারণ সংস্করণ:

var nestedDoc = new Schema({
  name: String
});

var mainDoc = new Schema({
  names: [nestedDoc]
});

JSON উদাহরণ

{
    "_id" : ObjectId("57c88bf5818e70007dc72e85"),
    "name" : "Corinthia Hotel Budapest",
    "stars" : 5,
    "description" : "The 5-star Corinthia Hotel Budapest on the Grand Boulevard offers free access to its Royal Spa",
    "photos" : [
        "/photos/hotel/corinthiahotelbudapest/1.jpg",
        "/photos/hotel/corinthiahotelbudapest/2.jpg"
    ],
    "currency" : "HUF",
    "rooms" : [
        {
            "type" : "Superior Double or Twin Room",
            "number" : 20,
            "description" : "These are some great rooms",
            "photos" : [
                "/photos/room/corinthiahotelbudapest/2.jpg",
                "/photos/room/corinthiahotelbudapest/5.jpg"
            ],
            "price" : 73000
        },
        {
            "type" : "Deluxe Double Room",
            "number" : 50,
            "description" : "These are amazing rooms",
            "photos" : [
                "/photos/room/corinthiahotelbudapest/4.jpg",
                "/photos/room/corinthiahotelbudapest/6.jpg"
            ],
            "price" : 92000
        },
        {
            "type" : "Executive Double Room",
            "number" : 25,
            "description" : "These are amazing rooms",
            "photos" : [
                "/photos/room/corinthiahotelbudapest/4.jpg",
                "/photos/room/corinthiahotelbudapest/6.jpg"
            ],
            "price" : 112000
        }
    ],
    "reviews" : [
        {
            "name" : "Tamas",
            "id" : "/user/tamas.json",
            "review" : "Great hotel",
            "rating" : 4
        }
    ],
    "services" : [
        "Room service",
        "Airport shuttle (surcharge)",
        "24-hour front desk",
        "Currency exchange",
        "Tour desk"
    ]
}

উদাহরণ:

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


1
এটি কার্যক্ষমতাগুলির মধ্যে একটি যা প্রশ্নটিকে মোটেই সমাধান করে না।
সাইবারওয়ম্বাট

আমি আরও কিছু বোঝার জন্য কিছুটা সম্পাদনা করেছি। আপনি কি মনে করেন?
ওয়েইন চিউ

3
নেস্টেড স্কিমা কীভাবে করবেন তা প্রশ্ন জিজ্ঞাসা করছে না। এটি নেস্টেড স্কিমা বা এম্বেড থাকা সাব ডকুমেন্টগুলির সাথে মঙ্গুজ আরও পারফরম্যান্ট কিনা তা নিয়ে আলোচনা। মূলত আমরা বেঞ্চমার্ক বা বাছাই বা প্রান্তের ক্ষেত্রে কথা বলছি যেখানে মঙ্গুজ একে অপরকে পছন্দ করে। এবং নির্বাচিত উত্তরের হিসাবে উল্লেখ করা হয়েছে যে এটি কমপক্ষে ভি 3 অন থেকে কোনও পার্থক্য দেখায় না।
সাইবারওয়ামব্যাট

17
সম্ভবত ওপি-তে কাজ করে না তবে আমি এটি খুব সহায়ক বলে মনে করেছি। ধন্যবাদ।
জিন হিগিংস

এটি ভাল যখন সমস্ত 3 স্কিমা এক .js ফাইলে ঘোষিত হয়, 3 টি আলাদা .js ফাইলে ঘোষিত হলে আমরা কীভাবে এটি পরিচালনা করতে পারি?
সত্যম

9

আমি মনে করি এটি অন্য কোথাও এসওতে একাধিক পোস্ট দ্বারা পরিচালিত হয়।

কিছু সংখ্যক:

বড় কীটি হ'ল এখানে কোনও উত্তর নেই, কেবল জটিল ট্রেড অফের একটি সেট।


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

0

উভয়ের মধ্যে কিছু পার্থক্য রয়েছে:

  • নেস্টেড স্কিমা ব্যবহার বৈধতার জন্য সহায়ক।

  • নেস্টেড স্কিমা অন্য স্কিমে পুনরায় ব্যবহার করা যেতে পারে।

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