mongoose中的自定义架构类型

时间:2014-12-27 05:24:24

标签: node.js mongodb mongoose

我是MongoDB的新手,正在开发一个专业网络项目,我必须区分模式中同一字段的ObjectId。我们说我有

架构:

TestSchema = new Schema({
    Invitation: {
        from: [
            type: schema.types.objectid,
            ref: 'User'
        ]
    }
});

Invitation可以是不同类型,例如活动邀请,连接请求邀请,如LinkedIn,或邀请参加现场会议或讨论。现在,如果我遵循上述架构,则ObjectId不同类型的邀请将存储在同一字段from中,该字段不是泛型,难以获取或区分哪个ObjectId {1}}属于哪种邀请类型。就像我将它们存储在单个数组[]中一样,我希望使该数组中的每个ObjectId易于区分。例如: -

{
    Invitation: {
        from: [Objectid(A), Objectid(B), Objectid(C)]
    }
}

我们说A属于活动邀请,B& C属于不同类型的邀请。上面的例子是我提出的逻辑。我还考虑使用子数组字段或子文档用于不同的邀请类型,但我认为应该有泛型方式。我花了相当多的时间在谷歌上寻找自定义对象概念的逻辑,并且不确定这个概念是否对我想要的内容有用。

2 个答案:

答案 0 :(得分:1)

我理解你的问题,你应该创建用户或事件类型Schema,如:

EventType = new Schema(){
type: String,
eventID: {
type: Schema.Types.ObjectId
ref: 'User'}
}

并通过创建EventType对象

在服务器端轻松访问它
var eventType = new EventType();
eventType.type = 'event'
eventType.eventID = //ObjectId of event doc

答案 1 :(得分:0)

@BatScream建议您在User架构中添加“类型”字段。

var User = new Schema({
    username: ...
    ...

    type: String        

});

这样您就可以区分(和 store )引用的User架构中的类型。

TestSchema.findById(xxx, function(err, test){
    test.invitation.from[0].type == user.type
});

但如果我理解您的用例,我认为您的type邀请实际上是UserInvitation之间的关系存储在TestSchema内(无论是什么))。如果是这样,您可能不希望将type存储在User中。也许将它存储在Invitation本身......

TestSchema = new Schema({
    Invitation: {
        from: [{
            type: String,
            user: {
                type: schema.types.ObjectId,
                ref: 'User'
            }
        }]
    }
});

这样您就可以区分(和商店 TestSchema

中的类型
TestSchema.findById(xxx, function(err, test){
    test.invitation.from[0].type == 'event' ??
    test.invitation.from[0].user == 'user' ...
});

此外,甚至可能是偏离主题,但Neo4j非常适合处理此类数据。在那个用户 - 和 - >之间的“关系”邀请本身就是一个实体,您可以在其中存储该类型。