स्कीमा को परिभाषित किए बिना आप मोंगोज़ का उपयोग कैसे करते हैं?


118

Mongoose के पिछले संस्करणों में (node.js के लिए) एक स्कीमा को परिभाषित किए बिना इसका उपयोग करने का विकल्प था

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

लेकिन वर्तमान संस्करण में "noSchema" फ़ंक्शन को हटा दिया गया है। मेरे स्कीमा अक्सर बदलने की संभावना रखते हैं और वास्तव में परिभाषित स्कीमा के साथ फिट नहीं होते हैं, इसलिए मोंगो में स्कीमा-कम मॉडल का उपयोग करने का एक नया तरीका है?


3
बस Mongodb सादे का उपयोग करें, डिफ़ॉल्ट रूप से कम स्कीमा
साइमन Dragsb Mayk

जवाबों:


175

मुझे लगता है कि यह वही है जो आप Mongoose Strict के लिए देख रहे हैं

विकल्प: सख्त

सख्त विकल्प, (डिफ़ॉल्ट रूप से सक्षम), यह सुनिश्चित करता है कि हमारे मॉडल उदाहरण में जोड़े गए मान जो हमारे स्कीमा में निर्दिष्ट नहीं थे, db में सहेजे नहीं जाते हैं।

नोट: जब तक आपके पास अच्छा कारण नहीं है, तब तक झूठे पर सेट न हों।

    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
आपने मेरा दिन बचाया। मुझे यह भी पता चला कि इसका उपयोग #markMotified ('<columnName>') के साथ नहीं किया जाना चाहिए
allenhwkim

6
पुनश्च: आपको इस विधि के साथ काम नहीं करने के thing.set(key, value)कारण thing.key=valueऐसा करना होगा , अर्थात यह अन्यथा डेटाबेस में परिवर्तित नहीं होता है।
लैगिंगसर्फ्लेक्स

4
यदि आप इस विधि का उपयोग करते हैं, तो आप डॉक्स को पुनः प्राप्त करते समय मुद्दों में चलेंगे। एक खोज करने के बाद और फिर doc.someProp doc.someProp को अपरिभाषित किया जाएगा, भले ही यह वास्तव में वस्तु पर हो (कंसोल कंसोल इस बात की पुष्टि करता है), यह इसलिए है क्योंकि मोंगोज़ अपने स्वयं के गाइटर को परिभाषित करता है जो केवल परिभाषित करने पर काम करते हैं। स्कीमा पर कि प्रोप
मेलबोर्न

1
@ a20: मैं समझता हूं कि आप क्या कहते हैं MySQL:) और मुझे लगता है कि जोनाथन का सुझाव / मोंगोसे एपीआई डॉक्स के अनुसार नोट: जब तक आपके पास अच्छा कारण न हो, तब तक झूठे पर सेट न करें । वर्तमान संदर्भ (केवल के बारे में NO-SQL) के साथ बिल्कुल ठीक है
अमोल एम कुलकर्णी

2
@ मेलबर्न 2991 यह एक हद तक सही है, हालांकि इसमें एक वर्कअराउंड है जो मुझे मिला। आप उस दस्तावेज़ पर toJSON () पद्धति को कॉल कर सकते हैं जिसे आपने पुनर्प्राप्त किया था जो तब आपको अपने नियमित डॉट नोटेशन जैसे doc.someProp का उपयोग करने की अनुमति देगा। इतने पुराने जवाब पर जवाब देने के लिए क्षमा करें। अगर कोई एक ही चीज के पार आता है तो बस इसे जोड़ना चाहता है। https://mongoosejs.com/docs/guide.html#toJSON
क्रिस

60

वास्तव में "मिश्रित" ( Schema.Types.Mixed) मोड में ठीक यही लगता है कि मानगो में ...

यह एक स्कीमा-कम , फ्रीफ़ॉर्म जेएस ऑब्जेक्ट को स्वीकार करता है - इसलिए आप इसे जो भी फेंक सकते हैं। ऐसा लगता है कि आपको उस वस्तु को बाद में मैन्युअल रूप से सहेजना ट्रिगर करना होगा, लेकिन यह एक निष्पक्ष व्यापार की तरह लगता है।

मिश्रित

एक "कुछ भी जाता है" स्कीमा टाइप, इसका लचीलापन व्यापार-बंद पर आता है जिसे बनाए रखना कठिन होता है। मिश्रित Schema.Types.Mixedएक खाली वस्तु शाब्दिक के माध्यम से या के माध्यम से उपलब्ध है । निम्नलिखित समतुल्य हैं:

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

चूंकि यह एक स्कीमा-कम प्रकार है, इसलिए आप अपनी पसंद की किसी भी चीज़ के लिए मूल्य बदल सकते हैं, लेकिन Mongoose उन परिवर्तनों का पता लगाने और सहेजने की क्षमता खो देता है। Mongoose को "बताने" के लिए कि एक मिश्रित प्रकार का मूल्य बदल गया है, .markModified(path)उस दस्तावेज़ के तरीके को कॉल करें जो आपके द्वारा परिवर्तित किए गए मिश्रित प्रकार के पथ को पार कर रहा है।

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

क्या यह अभी भी Mongo / Mongoose के साथ स्कीमा-कम काम करने का सही तरीका है?
a20

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
मैं इसे प्रश्न के वास्तविक उत्तर के रूप में नहीं देखता, हालांकि, @kwhitley के पास Mongoose का उपयुक्त उत्तर है।
जेनेक्स

मुझे सहमत होना होगा। मुझे यकीन नहीं है, हालाँकि, कि स्कीमा.ईप्स.मिक्सड ओपी के समय यह सवाल पूछ रहा था
हैकनाइटली

यहाँ ओपी, मैं आपसे सहमत होने के लिए इच्छुक हूं, हालांकि, जवाब एक साल बाद आया जब मैंने पहले ही इसे स्वीकार कर लिया था।
क्रिस्टोफर टर्कीनी

1

यहाँ विवरण का विवरण दिया गया है: [ https://www.meanstack.site/2020/01/save-data-to-mongodb-without-defining.htmldesing1]

    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

अब संभव नहीं है।

आप उन संग्रहों के साथ Mongoose का उपयोग कर सकते हैं जिनके पास स्कीमा और नोड ड्राइवर या उन स्कीमालेस मॉड्यूल के लिए एक और मोंगो मॉड्यूल है।

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

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.