[英]How do I find missing schema fields on a Mongoose query
如果我将新字段直接添加到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);
我可以读取每个文档密钥,如果未定义,则会引发错误,但这是唯一的方法吗?
版本 Node.js:6.5.0猫鼬:4.6.0
您可以在模式上将strict
设置为false
,这样即使它们不在模式中,它也会保存所有属性:
var userSchema = mongoose.Schema({ email: String, admin: Boolean }, {strict: false});
http://mongoosejs.com/docs/guide.html#strict
为了获得不在架构中的属性,您需要使用doc.toObject()
并使用返回的对象,或者使用doc.get('location')
接下来是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);
});
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.