【问题标题】:Censoring MongoDB fields with Mongoose使用 Mongoose 审查 MongoDB 字段
【发布时间】:2015-12-09 21:47:06
【问题描述】:

我正在考虑使用 Mongoose ORM 审查某些 MongoDB 字段的最佳方法。有

const userSchema = new Schema({
  last_name: {
  type: String,
  select: false,
  }
});

userSchema.virtual('last_name_initial').get(function () {
  return this.last_name.substr(0,1).toUpperCase();
});

不会这样做,因为last_name被设置为select: false,显然我不想发回last_name

【问题讨论】:

标签: mongodb mongoose


【解决方案1】:

当您在架构中的任何字段上指定 {select: false} 时,默认情况下该字段在查询中被排除。因此,在这种情况下,您的虚拟字段将仅适用于像这样查询过的对象:

User.find().select('+last_name').exec(function (err, users) {

    //The virtual field should be available here.
    console.log(users[0].last_name_initial);
});

如果您希望虚拟字段始终可用,而不必明确包含要选择的字段,那么最好使用其他方法而不是{select: false}

您可以默认排除该字段的一种方法是覆盖 toJSON 方法(source 和您有同样的问题)

userSchema.methods.toJSON = function() {
  var obj = this.toObject()
  delete obj.last_name
  return obj
}

注意:使用这种方法,您还应该为 toJSON 设置选项 {virtuals: true}。

userSchema.set('toJSON', {virtuals: true});

【讨论】:

  • 尝试你的答案不起作用,因为覆盖 toJSON 不包含虚拟字段,所以我最终删除了虚拟字段并执行:userSchema.methods.toJSON = function() { let obj = this.toObject(); obj.last_name_initial = obj.last_name.substr(0,1).toUpperCase();delete obj.last_name;return obj;};
  • 是的......这也很好......将检查 toJSON 的虚拟选项
猜你喜欢
  • 1970-01-01
  • 2014-03-09
  • 1970-01-01
  • 2018-04-14
  • 2021-08-29
  • 2020-09-25
  • 1970-01-01
  • 2021-09-18
  • 2013-01-09
相关资源
最近更新 更多