动态猫鼬字段类型

Dynamic Mongoose Field Type

我正在开发一个应用程序,用户可以在其中使用 mongoDB 和猫鼬将他的模型存储在数据库中。取自猫鼬教程,必须定义字段的类型。比如这里我们要定义name是一个字符串。

const personSchema = new mongoose.Schema({
  name: String
});
const Person = mongoose.model('Person', personSchema);

有什么方法可以让它根据用户的输入动态变化。我想创建一个表单,用户将在其中输入字段名称和 select Mongoose 提供的一种字段类型 [String、Number、Date etc],但我想不出任何实现它的方法。老实说,我不知道这是不是一个好方法。另一种方法是将所有内容作为字符串传递并序列化输入以存储它。我想实现这样的目标:

const {fieldName,fieldType} = userInput;

const customSchema = new mongoose.Schema({
  fieldName: fieldType
});
const CustomModel = mongoose.model('CustomSchema', customSchema);

这可能吗,或者我应该采用另一种方法吗?另一种方法是将所有内容作为字符串传递并序列化输入以存储它。

提前致谢!

您可以使用 Schema.Types.Mixed,一种“随心所欲”的 SchemaType。 Mongoose 不会在混合路径上进行任何转换。

let customSchema = new Schema({custom: Schema.Types.Mixed})

了解更多信息 here

如果我理解正确的话,它应该是这样工作的:

  • 用户定义要存储的模型
  • 架构是使用用户提供的数据创建的
  • 用户可以使用先前创建的模型将数据传递给存储,稍后将验证用户的输入

事实上,我正在开发一个具有相同功能的项目。这是我们的做法。

  • 用户发送模型,我们将其存储为字符串,因为我们需要能够再次创建模型。

  • 当用户使用创建的模型传递新数据进行存储时,我们从 mongo 获取字符串并解析它以创建模式。此操作相对容易(但取决于您想要实现的目标,因为如果您想要进行一些高级验证,它可能会变得棘手),因为您只需要从 mongoose 创建一个具有正确值的对象。对于用户定义的每个字段都是这样的。

    export const fieldConverter = ({name, type}) => {
       switch (type) {
         case 'String':
           return { [name]: String };
         case 'Number':
           return { [name]: Number };
        ...
    }
    

    当你准备好你的对象后,你就可以用它创建一个模型。 从 mongoose.models 访问模型这一行很重要,因为 mongoose 将缓存模型并在您尝试再次创建它时抛出错误。

    const DatasetModel =
      mongoose.models["your-model-name"] ??
      mongoose.model("your-model-name", new mongoose.Schema(schema));
    
  • 现在有了模型,剩下的就和正常创建的一样了。

这种方法对我们有用,所以我将其添加为灵感,也许它会对您有所帮助。如果您对实施有任何具体问题,请随时提出,我很乐意提供帮助。

如果以后不需要验证,mongoose 中还有一个 Mixed 类型。您可以在这里查看:https://mongoosejs.com/docs/schematypes.html#mixed

经过一些研究,我发现猫鼬类型也可以是字符串。例如

const personSchema = new mongoose.Schema({
  name: "String"
});
const Person = mongoose.model('Person', personSchema);

Mongoose 会处理它