Mongodb 如何在不定义模式的情况下使用Mongoose?
在以前版本的Mongoose(对于node.js)中,有一个选项可以在不定义模式的情况下使用它Mongodb 如何在不定义模式的情况下使用Mongoose?,mongodb,node.js,mongoose,Mongodb,Node.js,Mongoose,在以前版本的Mongoose(对于node.js)中,有一个选项可以在不定义模式的情况下使用它 var collection = mongoose.noSchema(db, "User"); 但在当前版本中,“noSchema”功能已被删除。我的模式可能会经常更改,并且确实不适合已定义的模式,因此是否有新的方法在mongoose中使用无模式模型?这已经不可能了 您可以将Mongoose与具有模式和节点驱动程序的集合一起使用,或者对那些无模式的集合使用另一个mongo模块 嘿,克里斯,看一看。我
var collection = mongoose.noSchema(db, "User");
但在当前版本中,“noSchema”功能已被删除。我的模式可能会经常更改,并且确实不适合已定义的模式,因此是否有新的方法在mongoose中使用无模式模型?这已经不可能了 您可以将Mongoose与具有模式和节点驱动程序的集合一起使用,或者对那些无模式的集合使用另一个mongo模块 嘿,克里斯,看一看。我对mongoose也有同样的问题,因为我的模式在开发过程中经常变化。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”。但我不需要这些。希望这有帮助 实际上,“混合”(Schema.Types.Mixed
)模式在Mongoose中似乎正好如此
它接受一个无模式的,自由形式的JS对象——因此,无论您对它抛出什么。看起来您必须在之后手动触发对该对象的保存,但这似乎是一个公平的权衡
混合的
作为一个“随遇而安”的SchemaType,它的灵活性取决于
它更难维护。可通过以下两种方式获得混合
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
- 我想这就是你想要的
选项:严格
strict选项(默认情况下启用)确保添加到模型实例中的值不会保存到数据库中,这些值在模式中未指定
注意:除非有充分理由,否则不要设置为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!!
以下是详细说明:[
你知道如何处理mongous中的偶然错误吗?这在文档中有点缺失。但我不认为这是问题的真正答案,@kwhitley对Mongoose有合适的答案。我必须同意。不过,我不确定,在问这个问题的时候Schema.types.mixed是可用的ed同意你的观点,但是,答案是在我接受这个答案一年后得出的。你救了我一天。我还发现这个不能与#markMotified(“”)PS一起使用:你必须做
事情。set(key,value)
因为thing.key=value
不适用于此方法,也就是说,它不会持久保存到数据库中。如果使用此方法,则在检索文档时会遇到问题。执行查找后,doc.someProp doc.someProp将未定义,即使它实际上存在于对象上(一个console.log证实了这一点),这是因为mongoose定义了它自己的getter,只有当您在schema@a20:我理解你对MySQL的看法,并且我认为建议/根据注释:除非你有充分的理由,否则不要设置为false。在当前上下文中完全可以(仅关于NO-SQL
)@Melbourne2991这在某种程度上是正确的,但是我发现了一个解决方法。您可以调用toJSON()方法,该方法将允许您使用常规的点表示法,如doc.someProp。很抱歉回答这样一个旧的答案。只是想添加此项,以防有人遇到相同的问题。这仍然是使用Mongo/Mongoose实现无模式工作的正确方法吗?但此结构将整个对象嵌套在any
字段,因此它实际上有一个模式。对OP的更好回答是使用strict:false
就像使用Mongodb平原一样,默认情况下这是一个较少的模式createConnection()instane的收集方法呢?
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