Javascript 创建不同类型的圆圈,如Google Plus
祝大家新年快乐, 我正在使用express、angular、node和MongoDb为医生创建一个社交网络,这是这些技术中的新技术,我一直在考虑为特定用户创建不同类型的圈子,就像googleplus那样,我们有不同的圈子,比如朋友和家人,在这里,我想创建具有不同专业的医生圈,并想知道我应该如何在后端处理它 模式:Javascript 创建不同类型的圆圈,如Google Plus,javascript,node.js,mongodb,express,mongoose,Javascript,Node.js,Mongodb,Express,Mongoose,祝大家新年快乐, 我正在使用express、angular、node和MongoDb为医生创建一个社交网络,这是这些技术中的新技术,我一直在考虑为特定用户创建不同类型的圈子,就像googleplus那样,我们有不同的圈子,比如朋友和家人,在这里,我想创建具有不同专业的医生圈,并想知道我应该如何在后端处理它 模式: var NetworkSchema = new Schema({ UserID: { type: Schema.Types.ObjectId, ref: 'User'
var NetworkSchema = new Schema({
UserID: {
type: Schema.Types.ObjectId,
ref: 'User'
NetworkList: [ ],
});
{
"NetworkList" : [
{
"__v" : 0,
"ID" : ObjectId("54a6de049754e5940c97435a"),
"__t" : "CIRCLE",
"_id" : ObjectId("54aa48ccba36d7ac1810e832")
},
],
"UserID" : ObjectId("54aa46ef65c266341494a528"),
"_id" : ObjectId("54aa46ef65c266341494a529")
}
到目前为止,我一直在想的是,在网络列表数组中插入不同的对象,这些对象具有不同的专业领域的字段名,如心脏专家、心脏病专家等。在网络列表数组中,它应该是通用的,因此,我将网络列表数组-留空,可能我的逻辑不太正确,这是文件
{
"NetworkList" : [
HeartSpecialist: [ //ObjectId's of HeartSpecialist ],
CardioLogists: [//ObjectId's of CardioLogists ]
..
],
"UserID" : ObjectId("54aa46ef65c266341494a528"),
"_id" : ObjectId("54aa46ef65c266341494a529")
}
当我对模式类型使用鉴别器时,例如:
var portalSchema = new Schema(),
CircleType = new Schema({
ID: {
type: Schema.Types.ObjectId,
ref: 'User'
}
});
CIRCLE = Portal.discriminator('CIRCLE', CircleType);
function logger(label,content) {
console.log(
'%s:\n%s\n', label,
util.inspect( content, false, 8, false ) );
}
async.waterfall([
function(callback){
var circleObj = new CIRCLE({'ID': req.body.Fid});
circleObj.save(function(err,circleObj) {
logger('Circles', circleObj);
callback(err,circleObj);
});
},
function(circleObj,callback){
var get = {'UserID':req.body.UserID};
var up = {$push:{'NetworkList':circleObj}};
Network.update(get,up,{upsert:true},function(err,user){
if (err) {
console.log(err);
return err;}});
]);
结果文档:
var NetworkSchema = new Schema({
UserID: {
type: Schema.Types.ObjectId,
ref: 'User'
NetworkList: [ ],
});
{
"NetworkList" : [
{
"__v" : 0,
"ID" : ObjectId("54a6de049754e5940c97435a"),
"__t" : "CIRCLE",
"_id" : ObjectId("54aa48ccba36d7ac1810e832")
},
],
"UserID" : ObjectId("54aa46ef65c266341494a528"),
"_id" : ObjectId("54aa46ef65c266341494a529")
}
我知道这个逻辑与我上面描述的或者我想要的完全不同,到目前为止,我已经提供了这个逻辑,我可以在上面的文档中区分具有“\uu t”的医生类型,可能我不是在寻找代码,而是一个实现循环类型功能的逻辑。
多谢各位
编辑:
问题:-当添加相同圆类型的医生时,相同圆类型的新对象存储在数据库中,这会导致冗余
{
"NetworkList" : [
{
"__v" : 0,
"ID" : ObjectId("54aa46ef65c266341494a528"),
"__t" : "CIRCLE", //two different objects of same circle
"_id" : ObjectId("54aa4a40bf50c41c14e389c4")
},
"54aa46ef65c266341494a528",
{
"__v" : 0,
"ID" : ObjectId("54a6de049754e5940c97435a"),
"__t" : "CIRCLE",
"_id" : ObjectId("54aa4add024eebd81fe009a2")
},
],
"UserID" : ObjectId("54a8291f8ed9a2b41eb164ff"),
"__v" : 0,
"_id" : ObjectId("54a8291f8ed9a2b41eb16500")
}
嗯,其中一些看起来像是我列出的答案代码,但它没有给你。也许是同一队。如果你真的玩弄“鉴别器”,你会发现当你按“模型类型”进行查询时,
\uu t
的值会“自动神奇地”为“对象类型”过滤。就像最初的人问的那样,你的方法似乎有点偏离你想要达到的最终目标。我们在同一个团队中,好像现在我正在开发用户圈模块,是的,我的方法可能有点偏离,因为每当我更新网络模型时,每次都会插入一个新的circleObj,所以可能我的整个逻辑都是错误的,我应该如何做到这一点似乎是这样的,但我试图帮助的是,这正是让这一点变得不清楚的原因。简单的术语。“NetworkList”数组中的所有内容都应该从基本对象“继承”到由“鉴别器”定义的新类型中。这就是猫鼬将如何进行类型的多态映射。如果一种类型是医生
,则您可以通过从该模型中查询来查询“基本集合”中的那些项目,\u v
中的“医生”将自动为您过滤。这很难解释,因为看起来你把东西放错地方了。原始答案解释得很详细。是的,我明白你的意思,但在这里,每次更新网络模型circleObj时,相同类型的circleObj都会保存到数据库中,问题是如果我添加另一个相同类型的用户/医生,那么会有另一个对象插入到circle类型的数据库中。我不知道应该使用什么查询,这样才能在单个对象中存储相同圆类型的医生的objectId。我正在编辑问题以使事情更清楚