gpt4 book ai didi

node.js - 来自另一个表的 Mongoose 验证值

转载 作者:太空宇宙 更新时间:2023-11-03 23:19:57 26 4
gpt4 key购买 nike

This is my Product table schema

let schema = new mongoose.Schema({
title: {type: String, required: true},
price: {type: Number, required: true},
description: {type: String, required: true},
sizes: {type: Object, required: true},
offer: {type: Number, default: 0},
images: {type: Array, required: true},
deal: {type: Boolean, default: false},
category: {
_id: {type: Schema.Types.ObjectId, required: true},
name: {type: String, required: true}
},
company_name: {type: String, required: true}
});

What I am trying to do

我正在尝试验证另一个名为 Category 的表中是否存在 category.name 值。

最佳答案

可以使用异步验证器并查询类别集合。像这样的东西(使用 Promise sytax 作为验证器):

let schema = new mongoose.Schema({
title: {type: String, required: true},
price: {type: Number, required: true},
description: {type: String, required: true},
sizes: {type: Object, required: true},
offer: {type: Number, default: 0},
images: {type: Array, required: true},
deal: {type: Boolean, default: false},
category: {
_id: {type: Schema.Types.ObjectId, required: true},
name: {
type: String,
required: true,

validate: function(nameVal) {
return new Promise(function(resolve, reject) {
let Category = mongoose.model('Category'); //you would have to be sure that Category model is loaded before this one. One reason not to do this
Category.findOne({name: nameVal}, (err, cat) => resolve(cat ? true : false)); //any non null value means the category was in the categories collection
});
}

}
},
company_name: {type: String, required: true}
});

对此的一些想法:

  1. 这记录于 http://mongoosejs.com/docs/validation.html#async-custom-validators .
  2. 正如其中所述,默认情况下更新时验证器不会运行。其中有很多注意事项需要阅读。
  3. 根据我使用 NoSQL 数据库的经验,创建新产品的代码会注意确保分配的类别有效。该代码可能在之前的某个时刻从数据库中找到了该类别。因此,验证器查找是多余的。但您可能会遇到这样的情况:您有大量创建产品的代码并希望在一个地方进行验证。
  4. 当我看到您将 {_id: ..., name: ...} 的文档存储为产品架构中的类别字段时,我认为您可能需要这样:

    ...
    category: {Schema.Types.ObjectId, ref: 'Category'},

    这允许您存储对从类别集合中检索到的类别的引用。如果您在查询中使用 populate 方法,当您检索产品时,Mongoose 将为您加载内联类别文档。请参阅http://mongoosejs.com/docs/populate.html 。有很多具有填充功能的选项,您可能会觉得有用。据我所知,它验证该类别在保存时是否有效。但如果您采用这种方法,您在保存之前就已经在代码中查找了之前的类别(请参阅链接以更好地了解我的意思)。从本质上讲,这为您提供了与 MongoDB 类似的连接行为,并具有存储节省和人们期望从“规范化”中获得的其他好处。

关于node.js - 来自另一个表的 Mongoose 验证值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50996901/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com