簡體   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