如何在Mongoose查询中找到缺少的架构字段

时间:2016-09-06 02:01:01

标签: node.js mongodb mongoose

如果我将新字段直接添加到我的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

2 个答案:

答案 0 :(得分:2)

您可以在架构上将strict设置为false,这样即使它们不在架构中,它也会保存所有属性:

&#13;
&#13;
var userSchema = mongoose.Schema({
  email: String,
  admin: Boolean
}, {strict: false});
&#13;
&#13;
&#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);
});