How do you use Mongoose without defining a schema?

Mongodbnode.jsMongoose

Mongodb Problem Overview


In previous versions of Mongoose (for node.js) there was an option to use it without defining a schema

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

But in the current version the "noSchema" function has been removed. My schemas are likely to change often and really don't fit in with a defined schema so is there a new way to use schema-less models in mongoose?

Mongodb Solutions


Solution 1 - Mongodb

I think this is what are you looking for Mongoose Strict

option: strict

The strict option, (enabled by default), ensures that values added to our model instance that were not specified in our schema do not get saved to the db.

Note: Do not set to false unless you have good reason.

    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!!

Solution 2 - Mongodb

Actually "Mixed" (Schema.Types.Mixed) mode appears to do exactly that in Mongoose...

it accepts a schema-less, freeform JS object - so whatever you can throw at it. It seems you have to trigger saves on that object manually afterwards, but it seems like a fair tradeoff.

> ##Mixed > > An "anything goes" SchemaType, its flexibility comes at a trade-off of > it being harder to maintain. Mixed is available either through > Schema.Types.Mixed or by passing an empty object literal. The > following are equivalent: > > var Any = new Schema({ any: {} }); > var Any = new Schema({ any: Schema.Types.Mixed }); > > Since it is a schema-less type, you can change the value to anything > else you like, but Mongoose loses the ability to auto detect and save > those changes. To "tell" Mongoose that the value of a Mixed type has > changed, call the .markModified(path) method of the document passing > the path to the Mixed type you just changed. > > person.anything = { x: [3, 4, { y: "changed" }] }; > person.markModified('anything'); > person.save(); // anything will now get saved

Solution 3 - Mongodb

Hey Chris, take a look at Mongous. I was having the same issue with mongoose, as my Schemas change extremely frequently right now in development. Mongous allowed me to have the simplicity of Mongoose, while being able to loosely define and change my 'schemas'. I chose to simply build out standard JavaScript objects and store them in the database like so

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
});

Far more simple than Mongoose, although I do believe you miss out on some cool middleware stuff like "pre". I didn't need any of that though. Hope this helps!!!

Solution 4 - Mongodb

Here is the details description: [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

Solution 5 - Mongodb

Note: The { strict: false } parameter will work for both create and update.

Solution 6 - Mongodb

Its not possible anymore.

You can use Mongoose with the collections that have schema and the node driver or another mongo module for those schemaless ones.

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

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionChristopher TarquiniView Question on Stackoverflow
Solution 1 - MongodbJonathan P. DiazView Answer on Stackoverflow
Solution 2 - MongodbkwhitleyView Answer on Stackoverflow
Solution 3 - MongodbHacknightlyView Answer on Stackoverflow
Solution 4 - MongodbVipul PanchalView Answer on Stackoverflow
Solution 5 - MongodbMohsin SunasaraView Answer on Stackoverflow
Solution 6 - MongodbmasylumView Answer on Stackoverflow