📅  最后修改于: 2023-12-03 15:32:57.778000             🧑  作者: Mango
在Mongoose中,我们可以使用Schema来定义数据模型。对于一些字段,我们需要指定引用(Reference),例如用户ID指向用户数据表中的ID。如果我们想要验证这样的引用是否存在,我们可以使用Mongoose的引用验证器。但是,如果我们有一个引用数组,如何在Mongoose中验证每个引用是否存在呢?
首先,我们需要在Schema中定义我们的引用数组。在下面的例子中,我们将在用户模型中定义一个“friends”字段,其中每个元素都是一个指向用户模型的引用。
const userSchema = new mongoose.Schema({
name: String,
email: String,
friends: [{
type: mongoose.Schema.Types.ObjectId,
ref: 'User'
}]
})
接下来,我们需要在Schema中编写一个引用验证器。这个验证器将在我们保存文档时执行,检查每个引用是否存在。如果任何一个引用不存在,将抛出一个验证错误。
userSchema.path('friends').validate(async (friends) => {
const promises = friends.map(async (friend) => {
const doc = await mongoose.model('User').findById(friend)
return !!doc
})
const results = await Promise.all(promises)
return results.every((result) => result === true)
}, 'Some friends do not exist')
在这个示例中,我们首先通过map函数迭代了每个朋友。在每个朋友上,我们使用findById来找到相应的文档。然后我们使用!!运算符将这个文档转换为一个布尔值,并将它作为Promise的结果返回。在所有的Promise都resolve之后,我们使用every函数检查所有的结果是否都是true。如果有任何一个结果是false,这个验证器将抛出一个错误。
const mongoose = require('mongoose')
const userSchema = new mongoose.Schema({
name: String,
email: String,
friends: [{
type: mongoose.Schema.Types.ObjectId,
ref: 'User'
}]
})
userSchema.path('friends').validate(async (friends) => {
const promises = friends.map(async (friend) => {
const doc = await mongoose.model('User').findById(friend)
return !!doc
})
const results = await Promise.all(promises)
return results.every((result) => result === true)
}, 'Some friends do not exist')
const User = mongoose.model('User', userSchema)
module.exports = User
在Mongoose中,我们可以使用引用数组来表示一些字段,如用户之间的朋友。要验证这个数组中每个引用是否存在,我们可以编写自定义的引用验证器。这个验证器将在我们保存文档时执行,检查每个引用是否存在。如果任何一个引用不存在,将抛出一个验证错误。完成这些步骤后,我们就可以轻松地使用Mongoose来验证引用数组。