使用 Mongoose 审查 MongoDB 字段

Posted

技术标签:

【中文标题】使用 Mongoose 审查 MongoDB 字段【英文标题】:Censoring MongoDB fields with Mongoose 【发布时间】: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

【问题讨论】:

github.com/Automattic/mongoose/issues/1195 【参考方案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 的虚拟选项

以上是关于使用 Mongoose 审查 MongoDB 字段的主要内容,如果未能解决你的问题,请参考以下文章

MongoDB (Mongoose) 如何使用 $elemMatch 返回所有文档字段

使用 mongoose 通过 update 方法向 mongodb 中的现有文档添加新字段

使用 mongoose 通过 update 方法向 mongodb 中的现有文档添加新字段

无法使用 mongoose 在 mongodb 中增加字段

使用 Mongoose 在投影中包含 Mongodb“_id”字段

使用 Mongoose 在投影中包含 Mongodb“_id”字段