如何在不定义模式的情况下使用 Mongoose?

在以前版本的 Mongoose (用于 node.js)中,有一个不用定义模式就可以使用它的选项

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

但在当前版本中,“ noSchema”函数已被删除。我的模式可能会经常变化,并且确实不适合已定义的模式,所以是否有一种新的方法可以在猫鼬中使用无模式模型?

93121 次浏览

再也不可能了。

您可以将 Mongoose 与具有模式和节点驱动程序的集合一起使用,或者为那些无模式的集合使用另一个 mongo 模块。

Https://groups.google.com/forum/#!msg/mongoose-orm/bj9ktji0naq/qsojymodwdyj

嘿,克里斯,看看 蒙哥。我在处理猫鼬时遇到了同样的问题,因为我的 Schema 在开发过程中变化非常频繁。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
});

比猫鼬要简单得多,尽管我相信你会错过一些很酷的中间件,比如“ pre”。但我不需要那些。希望这个能帮上忙! ! !

实际上,“混合”(Schema.Types.Mixed)模式似乎正是这样做的猫鼬..。

它接受一个 没有模式自由式 JS 对象自由式 JS 对象-所以你可以向它扔任何东西。看起来你必须在事后手动触发对象的保存,但这似乎是一个公平的交易。

混合的

一个“随心所欲”的 SchemaType,它的灵活性来自于 它更难维护。混合可以通过 或者通过传递一个空对象文本 以下是相当于:

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

我想这就是你要找的 猫鼬很严格

选择: 严格

严格选项(默认情况下启用)确保添加到模型实例中的、未在模式中指定的值不会保存到 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!!

以下是详细描述: [ 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

注意: { strict: false }参数同时适用于创建和更新。