所以我一直在尝试使用混合模式将CSP报告保存到Mongoose中,并遇到了各种各样的问题。
如果我尝试使用“无模式”方式保存任何内容,则只会保存默认的_v
和_id
字段
ViolationSchema = new Schema({});
Violation = mongoose.model('CSPViolation', ViolationSchema);
... wait for POST ...
new Violation( req.body ).save( callback );
// { _id : <some_id>, _v : <some_hash> }
如果我将架构中的字段设置为Mixed
并向该字段添加.markModified()
,则会保存。
ViolationSchema = new Schema({ report : { type : Mixed } });
Violation = mongoose.model('CSPViolation', ViolationSchema);
... wait for POST ...
var v = new Violation( { report : req.body } );
v.markModified('report');
v.save( callback );
// report saved under v.report.<actual_report>
我考虑使用本机MongoDB风格的collection.insert
,但它看起来不像模型有插入方法(也没有相关的模式)。
我想我也可以查看我正在保存的报告中的每个密钥并手动将其标记为已修改,但我想避免这样只是为了存储此类报告。
我是如何使用Mongoose盲目保存混合模式的?
答案 0 :(得分:6)
看起来这可以通过设置{ strict : false }
on the schema.来完成。这可以确保Mongoose会保存原始架构中未声明的任何字段。
通常情况下,这不是您在95%的数据上启用的内容,它完全符合我目前正在尝试做的事情。
ViolationSchema = new Schema({ type: Mixed }, { strict : false });
Violation = mongoose.model('CSPViolation', ViolationSchema);
... wait for POST ...
new Violation( req.body ).save( callback );
// Saves with full data