📜  mongoose 验证所需的引用数组 - Javascript (1)

📅  最后修改于: 2023-12-03 15:32:57.778000             🧑  作者: Mango

Mongoose验证所需的引用数组 - Javascript

在Mongoose中,我们可以使用Schema来定义数据模型。对于一些字段,我们需要指定引用(Reference),例如用户ID指向用户数据表中的ID。如果我们想要验证这样的引用是否存在,我们可以使用Mongoose的引用验证器。但是,如果我们有一个引用数组,如何在Mongoose中验证每个引用是否存在呢?

步骤
1. 在Schema中定义引用数组

首先,我们需要在Schema中定义我们的引用数组。在下面的例子中,我们将在用户模型中定义一个“friends”字段,其中每个元素都是一个指向用户模型的引用。

const userSchema = new mongoose.Schema({
  name: String,
  email: String,
  friends: [{
    type: mongoose.Schema.Types.ObjectId,
    ref: 'User'
  }]
})
2. 在Schema中定义引用验证器

接下来,我们需要在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来验证引用数组。