如果字段设置为 null,则恢复为 mongoose 中的默认值
Posted
技术标签:
【中文标题】如果字段设置为 null,则恢复为 mongoose 中的默认值【英文标题】:Revert to default value in mongoose if field is set to null 【发布时间】:2016-11-10 09:42:16 【问题描述】:我正在使用带有 nodeJS 的猫鼬。考虑以下架构:
var PersonSchema = new mongoose.Schema(
"name": type: String, default: "Human",
"age": type: Number, defualt:20
);
mongoose.model('Person', PersonSchema);
var order = new Order(
name:null
);
这将创建一个名称设置为 null 的新个人文档。
name:null,
age: 20
无论如何要检查正在创建/更新的属性是否为空,如果为空,请将其设置回默认值。以下声明
var order = new Order();
order.name = null;
order.save(cb);
应该创建一个名称设置为默认值的新个人文档。
name:"Human",
age: 20
如何使用 NodeJs 和 mongoose 实现这一点。
【问题讨论】:
【参考方案1】:有几种方法可以解决这个问题:
PRE-SAVE/PRE-VALIDATE 挂钩
Mongoose Middleware hooks
中间件(也称为 pre 和 post 钩子)是在异步函数执行期间传递控制权的函数。
PersonSchema.pre('save', function(next)
if (this.name === null)
this.name = 'Human';
next();
);
枚举
Mongoose Validation 和 Mongoose Enums
字符串有枚举、匹配、最大长度和最小长度验证器。
var PersonSchema = new mongoose.Schema(
"name": type: String, default: "Human", enum: ['Human', 'NONE-Human'],
"age": type: Number, defualt:20
);
更新 1
如果我有 20 个字段要检查它们是否设置为 null,我是否必须对所有字段重复 this.field = default?
我猜你必须这样做。
枚举中的 NONE-Human 是做什么的?我在网上找不到这方面的文档。
这只是带有枚举的 ENUM 示例,您可以仅选择 ENUM 中指定的值,即“名称”只能具有“人类”或“无人类”的值。 p>
【讨论】:
谢谢!我有两个快速跟进的问题。 1. 如果我有 20 个字段要检查它们是否设置为 null,我是否必须对所有字段重复 this.field = default? 2. NONE-Human in enums 做什么?我在网上找不到这方面的文档。 @NeilSanghrajka 用您的问题更新了我的答案。 =) @NeilSanghrajka 如果您觉得我的帮助有用,您是否可以选择我的答案作为已接受。谢谢 不错。但是请参阅 @Ralph 的 ***.com/a/42633419/9236556 很好地概括了它【参考方案2】:回答这个问题有点晚了,但更通用的方法是不在 pre 挂钩中再次对字段进行硬编码。
相反,让我们使用架构本身检查字段并检查具有default
值并明确设置为null
的字段。在这种情况下,我们将其设置为默认值。
PersonSchema.pre('save', function(next)
const self = this;
Object.keys(this.schema.paths).forEach(function(key)
if(self.schema.paths[key].options.default && self[key] === null)
self[key] = self.schema.paths[key].options.default;
);
next();
);
【讨论】:
+1。需要注意的是 TypeScript 不喜欢“self[key]”表示法。只需使用“self.set(key, value)”和“self.get(key)”分别进行属性和获取值。【参考方案3】:一个更晚的答案。我正在寻找一个更简单的解决方案并遇到了这个问题。我想我会分享我最终做了什么。
db.Person.create(
name: usersName || "Human",
age: usersAge,
)
【讨论】:
以上是关于如果字段设置为 null,则恢复为 mongoose 中的默认值的主要内容,如果未能解决你的问题,请参考以下文章