如何在不定义架构的情况下使用Mongoose?

时间:2011-03-20 19:22:27

标签: mongodb node.js mongoose

在早期版本的Mongoose(对于node.js)中,有一个选项可以在不定义架构的情况下使用它

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

但是在当前版本中,“noSchema”功能已被删除。我的模式可能经常更改,并且实际上不适合定义的模式,所以有没有一种在mongoose中使用无模式模型的新方法?

5 个答案:

答案 0 :(得分:143)

我认为这就是你在寻找的Mongoose Strict

选项:严格

strict选项(默认情况下启用)确保添加到模型实例中的未在我们的模式中指定的值不会保存到db。

注意:除非您有充分理由,否则请勿设置为false。

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

答案 1 :(得分:51)

实际上“混合”(Schema.Types.Mixed)模式似乎与Mongoose完全相同......

它接受无架构自由格式的JS对象 - 所以无论你能投入什么。看来你必须手动触发该对象的保存,但这似乎是一个公平的权衡。

  

混合

     

“任何事情都有”SchemaType,它的灵活性来自于权衡   它更难维护。混合可以通过   Schema.Types.Mixed或传递空对象文字。该   以下是等同的:

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

由于它是无模式类型,因此您可以将值更改为任何值   否则你喜欢,但是猫鼬失去了自动检测和保存的能力   那些变化。要“告诉”Mongoose混合类型的值   更改后,调用文档传递的.markModified(path)方法   您刚刚更改的混合类型的路径。

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

答案 2 :(得分:13)

嘿克里斯,看看Mongous。我和mongoose有同样的问题,因为我的Schemas现在在开发中经常变化。 Mongous允许我拥有Mongoose的简单性,同时能够松散地定义和改变我的“模式”。我选择简单地构建标准JavaScript对象并将它们存储在数据库中,如此

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

比Mongoose简单得多,虽然我确实相信你错过了一些很酷的中间件,比如“pre”。我不需要任何这些。希望这会有所帮助!!!

答案 3 :(得分: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

答案 4 :(得分:-8)

它不再可能了。

您可以将Mongoose与具有架构和节点驱动程序的集合或其他mongo模块一起用于那些无模式的集合。

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