【发布时间】:2020-04-17 04:53:45
【问题描述】:
我有一个简单的 Mongoose 架构,如下所示:
const fruitSchema = new mongoose.Schema({
name: {
type: String
required: true
},
type: {
type: String,
required: true
}
})
schema.index({ name: 1, type: 1 }, { unique: true })
const Fruit = mongoose.model('Fruit', fruitSchema)
在正常情况下,(name, type) 上的表是唯一的,因此用户可以为每个水果存储多种类型。但是,如果Fruit 的name 是apple,我想允许用户只存储一个type。
所以基本上,我想在保存之前进行以下检查:
if (newFruit.name === 'apple') {
if (Fruit.find({ name: 'apple' }).count >= 1) throw new Error()
}
执行此操作的一种方法是在预保存挂钩中执行上述代码。但是,我只是想知道在 Mongoose 模式本身中是否有一种内置的方式来指定它?
感谢您的帮助!
解决方案: 除了下面@SuleymanSah 提供的解决方案之外,我想我会发布我最终使用的解决方案。
const fruitSchema = new mongoose.Schema({
fruit: {
type: String
required: true,
async validate(name) {
if (name === 'apple') {
let fruit
try {
fruit = await Fruit.findOne({ name })
} catch (e) {
console.error('[Fruit Model] An error occurred during validation.')
console.error(e)
throw e // rethrow error if findOne call fails since fruit will be null and this validation will pass with the next statement
}
if (fruit) throw new Error(`A fruit for ${name} already exists.`)
}
},
type: {
type: String,
required: true
}
})
schema.index({ fruit: 1, type: 1 }, { unique: true })
const Fruit = mongoose.model('Fruit', fruitSchema)
【问题讨论】:
标签: node.js mongodb validation mongoose indexing