Node.js 猫鼬:如何从两种类型中选择一种

Node.js 猫鼬:如何从两种类型中选择一种,node.js,mongodb,mongoose,Node.js,Mongodb,Mongoose,我想在我的网站上有两种类型的用户——普通用户和网页设计师 如何在mongoose模式中指定一个可以是两个值的类型-“正常”或“设计器”两种类型之间的“选择”完全取决于您的意思 在简单的情况下,如果您只希望多个值对一个选项列表中的属性有效,则可以使用enum将唯一的值作为一种可能性: var userSchema=新模式({ “类型”:{“类型”:字符串,“枚举”:[“普通”,“开发人员”]} }); 这允许基本验证属性必须包含其中一个值,并且只能包含其中一个值。尝试设置为其他值或忽略该值将导致

我想在我的网站上有两种类型的用户——普通用户和网页设计师

如何在mongoose模式中指定一个可以是两个值的类型-“正常”或“设计器”

两种类型之间的“选择”完全取决于您的意思

在简单的情况下,如果您只希望多个值对一个选项列表中的属性有效,则可以使用
enum
将唯一的值作为一种可能性:

var userSchema=新模式({
“类型”:{“类型”:字符串,“枚举”:[“普通”,“开发人员”]}
});
这允许基本验证属性必须包含其中一个值,并且只能包含其中一个值。尝试设置为其他值或忽略该值将导致验证错误

但是,如果您想要更高级的东西,例如每个“类型”都有扩展字段的本质上不同的对象,那么“鉴别器”很可能适合您

这允许您在普通“用户”和“开发人员”之间拥有不同的属性,例如开发人员的项目列表。它们都将保存在同一个集合中,但它们都是具有自己的模式定义和规则的一流对象:

var util=require('util'),
async=require('async'),
mongoose=require('mongoose'),
Schema=mongoose.Schema;
猫鼬mongodb://localhost/test');
函数BaseSchema(){
Schema.apply(这个,参数);
这个。添加({
名称:String,
createdAt:{type:Date,默认值:Date.now}
});
}
继承(BaseSchema,Schema);
var userSchema=new BaseSchema();
var developerSchema=新的BaseSchema({
项目:[字符串]
});
var User=mongoose.model('User',userSchema),
Developer=User.discriminator('Developer',developerSchema);
异步系列(
[
函数(回调){
移除({},回调);
},
函数(回调){
async.eachSeries(
[
{“角色”:“用户”,“名称”:“账单”},
{“角色”:“开发者”,“姓名”:“Ted”,“项目”:[
“苹果”、“橙子”]}
],
函数(项,回调){
mongoose.model(item.role).create(item,callback);
},
回拨
);
},
函数(回调){
User.find().exec(函数(err,docs){
console.log(文档)
回调(err);
});
}
],
功能(err){
如果(错误)抛出错误;
mongoose.disconnect();
}
);
其输出显示同一集合中的两个对象:

[{u id:55ff7b22f1ff34f915cc8312,
姓名:'比尔',
__v:0,
创建日期:2015年9月21日星期一13:36:02 GMT+1000(AEST)},
{u id:55ff7b22f1ff34f915cc8313,
姓名:“Ted”,
__v:0,
__t:‘开发者’,
创建日期:2015年9月21日星期一13:36:02 GMT+1000(美国东部标准时间),
项目:[“苹果”、“橘子”]]
请注意,“开发人员”的“Ted”有另一个存储为
\uu t
的字段,该字段保存模型的鉴别器值。这允许
mongoose
在读取时对正确的对象施放魔法

这也意味着每个模型都可以独立使用,操作如下:

Developer.find().exec(函数(err,developers){});
create(newDev,function(err,Developer){});
它们分别“神奇地插入”了“类型”,这样每个操作只能找到或创建匹配的
\t:'Developer'
对象

因此,
enum
将对可能的值进行限制,
discriminator()
允许您为整个对象设置完全独立的定义。这取决于你所指的形式,但两者都很好使用。

两种类型之间的“选择”完全取决于你的意思

在简单的情况下,如果您只希望多个值对一个选项列表中的属性有效,则可以使用
enum
将唯一的值作为一种可能性:

var userSchema=新模式({
“类型”:{“类型”:字符串,“枚举”:[“普通”,“开发人员”]}
});
这允许基本验证属性必须包含其中一个值,并且只能包含其中一个值。尝试设置为其他值或忽略该值将导致验证错误

但是,如果您想要更高级的东西,例如每个“类型”都有扩展字段的本质上不同的对象,那么“鉴别器”很可能适合您

这允许您在普通“用户”和“开发人员”之间拥有不同的属性,例如开发人员的项目列表。它们都将保存在同一个集合中,但它们都是具有自己的模式定义和规则的一流对象:

var util=require('util'),
async=require('async'),
mongoose=require('mongoose'),
Schema=mongoose.Schema;
猫鼬mongodb://localhost/test');
函数BaseSchema(){
Schema.apply(这个,参数);
这个。添加({
名称:String,
createdAt:{type:Date,默认值:Date.now}
});
}
继承(BaseSchema,Schema);
var userSchema=new BaseSchema();
var developerSchema=新的BaseSchema({
项目:[字符串]
});
var User=mongoose.model('User',userSchema),
Developer=User.discriminator('Developer',developerSchema);
异步系列(
[
函数(回调){
移除({},回调);
},
函数(回调){
async.eachSeries(
[
{“角色”:“用户”,“名称”:“账单”},
{“角色”:“开发者”,“姓名”:“Ted”,“项目”:[
“苹果”、“橙子”]}
],
函数(项,回调){
mongoose.model(item.role).create(item,callback);
},
回拨
);
},
函数(回调){
User.find().exec(函数(err,docs){
console.log(文档)
回调(err);
});
}
],
功能(err){
如果(错误)抛出错误;
mongoose.disconnect();
}
);
对于哪个输出