Mongodb 如何存储不同类型的实体

Mongodb 如何存储不同类型的实体,mongodb,Mongodb,我试图找到存储不同类型实体的最佳方法 我有一个通用实体Person和两种类型的PersonPersonType1和PersonType2继承自Person实体字段 我需要将这些人员数据存储到mongo db 创建一个集合还是创建一个集合来绘制每种类型更好?这里您基本上讨论的是类在不同属性中不同于基类的一般持久性 在数据持久化的常见实现中,这通常由鉴别器模式处理,因此通常在同一“集合”中,尤其是在处理不同属性非常好的面向文档的数据库中 因此,一般来说,在MongoDB下,将这些“固有”对象存储在单

我试图找到存储不同类型实体的最佳方法

我有一个通用实体
Person
和两种类型的Person
PersonType1
PersonType2
继承自
Person
实体字段

我需要将这些人员数据存储到mongo db


创建一个集合还是创建一个集合来绘制每种类型更好?

这里您基本上讨论的是类在不同属性中不同于基类的一般持久性

在数据持久化的常见实现中,这通常由鉴别器模式处理,因此通常在同一“集合”中,尤其是在处理不同属性非常好的面向文档的数据库中

因此,一般来说,在MongoDB下,将这些“固有”对象存储在单个集合中的概念基本上是一个好主意。将共享公共属性或其他相关数据的东西放在同一个集合中有好处,因为演示是必要的

不是认可,但可以通过库可用的构造函数演示一个简单的示例。因此,作为一个好处示例,它适合(对我而言)进行快速演示:

var util=require('util'),
async=require('async'),
mongoose=require('mongoose'),
Schema=mongoose.Schema;
猫鼬mongodb://localhost/school');
//基类型的Util函数
函数AbstractPersonSchema(){
Schema.apply(这个,参数);
这个。添加({
名称:String,
年龄:数字,,
性别:{type:String,enum:['男性','女性']}
});
}
继承(AbstractPersonSchema,Schema);
//模式定义
var personSchema=新抽象personSchema();
var studentSchema=新的AbstractPersonSchema({
课程:[字符串]
});
var teacherSchema=新的AbstractPersonSchema({
部门:字符串,
教授:[字符串]
});
//示范作业
var Person=猫鼬模型('Person',personSchema),
Student=Person.discriminator('Student',studentSchema),
教师=Person.discriminator('Teacher',teacherSchema);
var normalPeople=[
{“姓名”:“比尔”,“年龄”:48,“性别”:“男性”},
{“姓名”:“莎拉”,“年龄”:24岁,“性别”:“女性”}
];
var学生=[
{
“姓名”:“Ted”,
“年龄”:21岁,
“性别”:“男性”,
“课程”:[“数学”、“科学”、“英语”]
},
{
“姓名”:“朱莉”,
“年龄”:22岁,
“性”:“女性”,
“课程”:[“艺术”、“历史”、“英语”]
}
];
教师=[
{
“名字”:“哈利”,
“年龄”:35岁,
“性别”:“男性”,
“系”:“数学”,
“教”:[“数学”、“科学”、“英语”]
},
{
“姓名”:“莎莉”,
“年龄”:32岁,
“性”:“女性”,
“部门”:“历史”,
“教授”:[“英语”、“历史”]
}
];
异步系列(
[
//示例清理
函数(回调){
Person.remove({},回调);
},
函数(回调){
异步并行(
[
函数(回调){
async.each(普通人,函数(人,回调){
Person.create(Person,callback);
},回调);
},
函数(回调){
async.each(学生,函数(学生,回调){
创建(学生,回调);
},回调);
},
函数(回调){
async.each(教师,函数(教师,回调){
创建(教师,回调);
},回调);
}
],
回拨
);
},
函数(回调){
console.log(“每个科目的教师”);
教师总人数(
[
{“$REWIND”:“$TEACHITS”},
{“$组”:{
“_id”:“$t”,
“计数”:{“$sum”:1}
}}
],
函数(错误、结果){
如果(错误)回调(错误);
控制台日志(结果);
回调();
}
);
},
函数(回调){
console.log(“学科中的学生和教师”);
个人合计(
[
{“$match”:{“\uu t”:{“$in”:[“教师”,“学生”]}},
{“$project”:{
“名称”:1,
“u_t”:1,
“主题”:{
“$cond”:[
{“$eq”:[“$\uu t”,“Teacher”]},
“$s”,
“$课程”
]
}
}},
{“$unwind”:“$subject”},
{“$组”:{
“_id”:“$subject”,
“教师”:{
“$addToSet”:{
“$cond”:[
{“$eq”:[“$\uu t”,“Teacher”]},
“$name”,
假的
]
}
},
“学生”:{
“$addToSet”:{
“$cond”:[
{“$eq”:[“$”学生“]},
“$name”,
假的
]
}
}
}},
{“$project”:{
“教师”:{“$setDifference”:[“$teachers”,[false]]},
“学生:{“$setDifference”:[“$students”,[false]]}
}}
],
功能(错误、结果){
如果(错误)回调(错误);
控制台日志(结果);
回调();
}
);
},
函数(回调){
console.log(“学生平均年龄”);
学生总数(
[
{“$组”:{
“_id”:空,
“平均年龄”:{“$avg”:“$age”}
}}
],
功能(错误、结果){
如果(错误)抛出错误;
控制台日志(结果);
回调();
}
)
},
函数(回调){
console.log(“正常人的平均年龄”);
个人合计(
[
{“$match”:{“\uu t”:{“$exists”:false}},
{“$组”:{
“_id”:空,
“平均年龄”:{“$avg”:“$age”}