繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM