如果我将新字段直接添加到我的MongoDB数据库中并且忘记将它们添加到我的Mongoose模式中,如何在没有静默失败的情况下提醒自己解决问题。
以下示例显示所有字段都是从查询返回的(无论架构如何),但如果您访问密钥则未定义。
var mongoose = require('mongoose');
var user_conn = mongoose.createConnection('mongodb://db/user');
var userSchema = mongoose.Schema({
email: String,
// location: String,
admin: Boolean
});
var User = user_conn.model('User', userSchema);
User.findOne({email: 'foo@bar.com.au'}, function (err, doc) {
if (err) return console.log(err);
console.log(doc);
console.log(doc.email);
console.log(doc.location);
});
结果:
{ _id: 57ce17800c6b25d4139d1f95,
email: 'foo@bar.com.au',
location: 'Australia',
admin: true,
__v: 0 } // <-- console.log(doc);
foo@bar.com.au // <-- console.log(doc.email);
undefined // <-- console.log(doc.location);
如果未定义,我可以读取每个doc键并抛出错误,但这是唯一的方法吗?
版本 Node.js:6.5.0 猫鼬:4.6.0
答案 0 :(得分:2)
您可以在架构上将strict
设置为false
,这样即使它们不在架构中,它也会保存所有属性:
var userSchema = mongoose.Schema({
email: String,
admin: Boolean
}, {strict: false});
&#13;
http://mongoosejs.com/docs/guide.html#strict
要获取不在架构中的属性,您需要使用doc.toObject()
并使用返回的对象,或使用doc.get('location')
答案 1 :(得分:2)
继Amiram的回答之后。我现在使用lean()在查询期间获取对象,但是当我需要更新或保存时,它仍然会查找模式。
User.findOne({email: 'foo@bar.com.au'}).lean().exec(function (err, doc) {
console.log(doc);
console.log(doc.email);
console.log(doc.location);
});