স্কিমার সংজ্ঞা না দিয়ে আপনি কীভাবে মঙ্গুজকে ব্যবহার করবেন?


118

মঙ্গুজের পূর্ববর্তী সংস্করণগুলিতে (নোড.জেএস এর জন্য) স্কিমাটি সংজ্ঞায়িত না করে এটি ব্যবহারের বিকল্প ছিল

var collection = mongoose.noSchema(db, "User");

তবে বর্তমান সংস্করণে "NoSchema" ফাংশনটি সরানো হয়েছে। আমার স্কিমাগুলি প্রায়শই পরিবর্তিত হতে পারে এবং সত্যই কোনও সংজ্ঞায়িত স্কিমার সাথে খাপ খায় না তাই মঙ্গুজে স্কিমা-কম মডেলগুলি ব্যবহার করার নতুন উপায় আছে কি?


3
কেবল মংডব প্লেইনটি ব্যবহার করুন, স্কিমাটি ডিফল্টরূপে কম হবে
সাইমন ড্রাগসব্যাক

উত্তর:


175

আমি মনে করি আপনি এটি মঙ্গুজ স্ট্রাইককে খুঁজছেন

বিকল্প: কঠোর

কড়া বিকল্প, (ডিফল্টরূপে সক্ষম), নিশ্চিত করে যে আমাদের মডেল উদাহরণগুলিতে যে মানগুলি যুক্ত হয়েছে যা আমাদের স্কিমাতে নির্দিষ্ট করা হয়নি তা ডিবিতে সংরক্ষণ না হয়।

দ্রষ্টব্য: আপনার যদি ভাল কারণ না থাকে তবে মিথ্যাতে সেট করবেন না।

    var thingSchema = new Schema({..}, { strict: false });
    var Thing = mongoose.model('Thing', thingSchema);
    var thing = new Thing({ iAmNotInTheSchema: true });
    thing.save() // iAmNotInTheSchema is now saved to the db!!

2
আপনি আমার দিন বাঁচিয়েছেন। আমি আরও জানতে পেরেছি যে এটি অবশ্যই # চিহ্নমোটাইফায়েড ('<কলামোনেম>')
অ্যালেনহকিম

6
পিএস: আপনাকে করতে হবে thing.set(key, value)কারণ thing.key=valueএই পদ্ধতিতে কাজ করে না, অর্থাত্ এটি অন্যথায় ডাটাবেসে পরিবর্তিত হয় না।
laggingreflex

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

1
@ a20: আপনি যা বলছেন তা আমি বুঝতে পেরেছি MySQL:) এবং আমি মনে করি জোনাথন পরামর্শ / মঙ্গুজ এপিআই ডক্স অনুসারে দ্রষ্টব্য: আপনার যদি ভাল কারণ না থাকে তবে মিথ্যাতে সেট করবেন না । বর্তমান প্রসঙ্গে (কেবলমাত্র NO-SQL) সাথে একদম ঠিক আছে
আমল এম কুলকার্নি

2
@ মেলবোর্ন ২ 91 91৯ এটি একটি পরিমাণে সত্য, তবে আমি খুঁজে পেয়েছি এমন একটি কাজ রয়েছে। আপনি যে দস্তাবেজটি পুনরুদ্ধার করেছেন তাতে আপনি জেএসএন () পদ্ধতিতে কল করতে পারেন যা আপনাকে ডকস.সোমপ্রপের মতো আপনার নিয়মিত ডট স্বরলিপি ব্যবহার করতে দেয়। এই ধরনের একটি পুরানো উত্তর উত্তর দিতে দুঃখিত। কেউ যদি একই জিনিসটি আসে তখন কেবল এটি যুক্ত করতে চেয়েছিলেন। https://mongoosejs.com/docs/guide.html#toJSON
ক্রিস

60

আসলে "মিক্সড" ( Schema.Types.Mixed) মোডটি মঙ্গুজে ঠিক তেমনটি করে ...

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

মিশ্র

একটি "কিছু যায়" স্কিমটাইপ, এর নমনীয়তা একটি বাণিজ্য-অফ এ আসে এটি বজায় রাখা কঠিন being Schema.Types.Mixedআক্ষরিক মাধ্যমে একটি ফাঁকা বস্তুর মাধ্যমে বা মিশ্রিত মিশ্রিত পাওয়া যায় । নিম্নলিখিত সমতুল্য:

var Any = new Schema({ any: {} });
var Any = new Schema({ any: Schema.Types.Mixed });

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

person.anything = { x: [3, 4, { y: "changed" }] };
person.markModified('anything');
person.save(); // anything will now get saved

এটি কি মঙ্গো / মঙ্গুজের সাথে স্কিমা-কম কাজ করার সঠিক উপায়?
20

5
তবে এই কাঠামোটি anyক্ষেত্রের নীচে পুরো বস্তুকে বাসা বেঁধে রাখে , সুতরাং এটির আসলে একটি স্কিমা আছে। এই উত্তরstrict: false যেমনটি বলেছে
স্টেপ পাওয়ার

16

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

function User(user){
  this.name = user.name
, this.age = user.age
}

app.post('save/user', function(req,res,next){
  var u = new User(req.body)
  db('mydb.users').save(u)
  res.send(200)
  // that's it! You've saved a user
});

মঙ্গুজের চেয়ে অনেক সহজ, যদিও আমি বিশ্বাস করি যে আপনি "প্রাক" এর মতো কিছু দুর্দান্ত মিডলওয়্যার স্টাফ মিস করেছেন। যদিও এর কোনও দরকার নেই আমার। আশাকরি এটা সাহায্য করবে!!!


1
আপনি কীভাবে চান্স দ্বারা mongous মধ্যে ত্রুটিগুলি পরিচালনা করতে ? এটি ডক্সে কিছুটা অনুপস্থিত।
এরিক অাইনার

4
যদিও আমি এটিকে প্রশ্নের আসল উত্তর হিসাবে দেখছি না, @KWitley এর মঙ্গুজ সম্পর্কিত উপযুক্ত উত্তর রয়েছে।
জেনেক্স

আমাকে মানতে হতই। যদিও আমি নিশ্চিত নই যে এই প্রশ্নটি জিজ্ঞাসা করার সময় ওপেনের সময় স্কিমা.টাইপস.মিক্সেড পাওয়া গিয়েছিল
হ্যাকনাইটেলি রোজ

এখানে ওপি, আমি আপনার সাথে একমত হতে আগ্রহী, তবে, আমি ইতিমধ্যে এটি গ্রহণ করেছি এর এক বছর পরে উত্তর এসেছিল।
ক্রিস্টোফার

1

এখানে বিস্তারিত বিবরণ: [ https://www.meanstack.site/2020/01/save-data-to-mongodb-without-defining.html][1]

    const express = require('express')()
    const mongoose = require('mongoose')
    const bodyParser = require('body-parser')
    const Schema = mongoose.Schema

    express.post('/', async (req, res) => {
        // strict false will allow you to save document which is coming from the req.body
        const testCollectionSchema = new Schema({}, { strict: false })
        const TestCollection = mongoose.model('test_collection', testCollectionSchema)
        let body = req.body
        const testCollectionData = new TestCollection(body)
        await testCollectionData.save()
        return res.send({
            "msg": "Data Saved Successfully"
        })
    })


  [1]: https://www.meanstack.site/2020/01/save-data-to-mongodb-without-defining.html

-9

এটি আর সম্ভব নয়।

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

https://groups.google.com/forum/#!msg/mongoose-orm/Bj9KTjI0NAQ/qSojYmoDwDYJ

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