mongodb - 使用 min 验证器验证 mongoose 编号字段
问题描述
我有一个这样声明的字段
storeCreditD: {
storeCredit: {
type: Number,
default: 0,
min: [0, 'credit cannot be negative']
},
storeDeposit: {
type: Number,
default: 0,
min: [0, 'deposit cannot be negative']
}
}
这是我改变模型
const store = await Store.findOneAndUpdate(
{ _id: storeId },
{ $inc: { 'storeCreditD.storeCredit': credit,
'storeCreditD.storeDeposit': credit } },
{ new: true }
现在,当我尝试用负信用来做这件事时(示例)
const credit = -60
,我预计 mongoose 验证器会抛出错误,因为它试图将两个字段都保存为负值。
令我惊讶的是,没有引发错误并保存了负值。我究竟做错了什么?
解决方案
您在此处定义的验证器只是一个中间件.save()
,当您尝试在架构上使用方法时,它将检查条件。还有一些用于更新的特殊验证器(在此处描述),但不幸的是,它们不支持$inc
在数据库中执行的操作(在猫鼬之外)。
某种解决方法可能是修改您的find()
条件以包括最低要求的信用:
let credit = -60;
let minStoreCredit = Math.abs(credit);
const store = await Store.findOneAndUpdate(
{ storeId: storeId, 'storeCreditD.storeCredit': { $gte: minStoreCredit } },
{ $inc: { 'storeCreditD.storeCredit': credit } },
{ new: true });
console.log(store);
在这种情况下,您将null
在信用少于60
或更新结果时获得。
推荐阅读
- javascript - 使用 React.js 问题获取本地 JSON 对象,错误:位置 0 处 JSON 中的意外标记 <
- powershell - 如何为使用动态参数的高级函数 cmdlet 创建包装器
- r - 将 {{}}(dplyr 双花括号)插值转换为字符串
- java - 如何解决“需要运行 Java 8 或更高版本。请下载并安装最新的 Java 运行时。” 在 VSCode 中?
- ios - 奖励插页式广告 - 如何对用户取消广告做出反应?(AdMob 谷歌广告,iOS)
- android - 我无法在移动(android)REACT NATIVE 中运行应用程序
- firebase - 如何在云 Firestore 中使用云功能存储 DateTime?
- mysql - 如何为mysql中的每个文件恢复多个sql文件到不同的数据库名称?
- regex - 我需要提取每个 resourceList 值并将它们循环
- visual-studio - 即使没有代码更改,Visual Studio 上的 Xamarin 也会始终重新生成。它以前没有这样做