当前位置: 首页 > 面试题库 >

mongoose:扩展架构

石喜
2023-03-14
问题内容

目前,我有两个几乎相同的架构:

var userSchema = mongoose.Schema({

    email: {type: String, unique: true, required: true, validate: emailValidator},
    passwordHash: {type: String, required: true},

    firstname: {type: String, validate: firstnameValidator},
    lastname: {type: String, validate: lastnameValidator},
    phone: {type: String, validate: phoneValidator},

});

var adminSchema = mongoose.Schema({

    email: {type: String, unique: true, required: true, validate: emailValidator},
    passwordHash: {type: String, required: true},

    firstname: {type: String, validate: firstnameValidator, required: true},
    lastname: {type: String, validate: lastnameValidator, required: true},
    phone: {type: String, validate: phoneValidator, required: true},

});

它们的唯一区别在于验证:用户不需要名字,姓氏或电话。但是,管理员必须定义这些属性。

不幸的是,上面的代码不是很干,因为它们几乎相同。因此,我想知道是否有可能adminSchema基于userSchema。例如:

var adminSchema = mongoose.Schema(userSchema);
adminSchema.change('firstname', {required: true});
adminSchema.change('lastname', {required: true});
adminSchema.change('phone', {required: true});

显然,这只是伪代码。这样的事情可能吗?

另一个非常相似的问题是,是否有可能基于另一个创建新的架构,并为其添加更多属性。例如:

var adminSchema = mongoose.Schema(userSchema);
    adminSchema.add(adminPower: Number);

问题答案:

在其他地方,有人建议使用utils.inherits扩展架构。另一种简单的方法是使用设置简单地设置对象并从中创建模式,如下所示:

var settings = {
  one: Number
};

new Schema(settings);

settings.two = Number;
new Schema(settings);

不过,这有点丑陋,因为您要修改同一对象。我也希望能够扩展插件和方法等。因此,我的首选方法如下:

function UserSchema (add) {
  var schema = new Schema({
    someField: String
  });

  if(add) {
    schema.add(add);
  }

  return schema;
}

var userSchema = UserSchema();
var adminSchema = UserSchema({
  anotherField: String
});

哪个恰好回答了您的第二个问题, 是的,您可以add()字段。因此,要修改Schema的某些属性,可以对上述函数进行修改以解决您的问题:

function UserSchema (add, nameAndPhoneIsRequired) {
  var schema = new Schema({
    //...
    firstname: {type: String, validate: firstnameValidator, required: nameAndPhoneIsRequired},
    lastname: {type: String, validate: lastnameValidator, required: nameAndPhoneIsRequired},
    phone: {type: String, validate: phoneValidator, required: nameAndPhoneIsRequired},
  });

  if(add) {
    schema.add(add);
  }

  return schema;
}


 类似资料:
  • 为什么要扩展mongoose模型? 我们对业务进行分层处理 service(多模型操作) -> dao(单一模型操作) -> model(模型定义) 所以我们在dao层需要很多单一模型的数据库操作方法的封装,如果业务非常复杂,比如一个超级查询方法,然后又有各种具体业务定义方法,难道我们一个一个的都写在dao层么? 事实上dao只做暴露给service的方法,而具有一定业务约定的方法是可以放到mo

  • 保护浏览器不受扩展的缺陷影响 保护浏览器不受扩展的缺陷影响 Adam Barth, Adrienne Porter Felt, Prateek Saxena, and Aaron Boodman EECS Department. University of California, Berkeley. Technical Report No. UCB/EECS-2009-185 摘要 浏览器扩展非常

  • 架构及扩展 一、单入口应用程序 基于SpeedPHP框架开发的应用程序,均是“单入口应用程序”(以下简称单入口程序),这是SpeedPHP框架的默认配置。 单入口程序概述 指在同一个应用程序中,访问者仅可以通过相同的一个文件来使用整个应用程序的功能。这个文件称作“入口文件”,而这种结构的应用程序整体就称作“单入口应用程序”。 在sp框架内,入口文件就是程序顶级目录的index.php文件。 一般而

  • 第十三章介绍了如何开发一个Web框架,通过介绍MVC、路由、日志处理、配置处理完成了一个基本的框架系统,但是一个好的框架需要一些方便的辅助工具来快速的开发Web,那么我们这一章将就如何提供一些快速开发Web的工具进行介绍,第一小节介绍如何处理静态文件,如何利用现有的twitter开源的bootstrap进行快速的开发美观的站点,第二小节介绍如何利用前面介绍的session来进行用户登录处理,第三小

  • 作者:陈希章 发表于 2018年4月7日 前言 此前我有一篇 文章 讲解了Microsoft Graph的一种数据扩展技术—— 开发扩展(Open Extensions),它可以实现在支持的对象(例如用户,组等)上面附加任意的数据。但开放扩展的问题在于,它是基于某个具体对象的,你无法确定两个对象是否具有同样的扩展(即便属性名一样,但也可能其包含的数据完全不同)。如果我们需要对一类对象进行统一的扩展

  • 问题内容: 我正在使用一个Spark数据框,该数据框可能正在从三个不同架构版本之一加载数据: 我可以通过检查架构是否包含字段“ C”以及是否不向数据框添加新列来处理其他“ C”。但是我不知道如何为子对象创建一个字段。 问题答案: JSON源不是非常适合具有不断发展的模式的数据(而不是Avro或Parquet),但是简单的解决方案是对所有源使用相同的模式,并使新字段为可选/可为空: 您可以像这样传递