mongoose自定义模式类型

时间:2013-09-17 20:27:01

标签: node.js mongoose

我从mongoose文档中读到可以创建自定义模式类型以添加​​到已存在的模式类型中。

正如我所建议的那样,我试着研究一下mongoose-long的例子:https://github.com/aheckmann/mongoose-long

我在我正在开发的应用程序中需要这个,我有一个mongoose模型的配置文件。该个人资料有多个字段,例如namesurname等等MultiValueFieldMultiValueField在对象上,具有以下结构:

{
    current : <string>
    providers : <Array>
    values : {
         provider1 : value1,
         provider2 : value2
    }
}

上面的结构有一个允许的提供者列表(按优先级排序),从中可以检索字段的值。当前属性会跟踪当前选择哪个提供程序作为字段的值。最后,对象值包含每个提供者的值。

我在node.js中定义了一个对象,其构造函数将上面的结构作为参数,并提供了许多有用的方法来设置新的提供者,添加值等等。

我的个人资料的每个字段都应使用不同的提供商列表进行初始化,但我还没有找到办法。

如果我将MultiValueField定义为Embedded Schema,我只能将每个字段定义为Array。此外,我无法在使用提供者列表创建配置文件时初始化每个字段。

我认为最好的解决方案是定义SchemaType MultiValueFieldType,它具有返回MultiValueField object的强制转换函数。但是,如何定义这样的自定义架构类型?如何在配置文件的架构中定义自定义选项时使用自定义选项?

我已经在mongoose Google小组上发布了一个问题,询问如何创建自定义架构类型:https://groups.google.com/forum/?fromgroups#!topic/mongoose-orm/fCpxtKSXFKc

1 个答案:

答案 0 :(得分:0)

我也能够仅将自定义模式类型创建为数组。您将能够初始化模型,但这种方法有缺点:

  • 即使您不需要数组也会有数组
  • 如果您在其他模型上使用ParameterSchema,则需要复制它

自定义架构类型代码:

// Location has inputs and outputs, which are Parameters

// file at /models/Location.js
var mongoose = require('mongoose');
var Schema = mongoose.Schema;

var ParameterSchema = new Schema({
  name: String,
  type: String,
  value: String,
});

var LocationSchema = new Schema({
    inputs: [ParameterSchema],
    outputs: [ParameterSchema],
});

module.exports = mongoose.model('Location', LocationSchema);

初始化模型:

// file at /routes/locations.js
var Location = require('../models/Location');

var location = { ... } // javascript object usual initialization

location = new Location(location);
location.save();

当此代码运行时,它将使用其参数保存初始化位置。

我不理解你的问题的所有主题,但我希望这个答案可以帮助你。