使用外键并映射到EXTJS

时间:2015-05-07 20:46:57

标签: mongodb extjs mongoengine

我正在使用基于mongo的数据库架构,其中包含ReferenceFields(ObjectIds)列表。

假设我有两个模型:User,Group

用户对象:

{
"_id" : ObjectId("554ba2897fdd66239457fb33"),
"name" : "something"
}

组对象:

{
"_id" : ObjectId("453490sdkjskldfjlskdjf"),
"name" : "group_name",
users : [ ObjectId("554ba2897fdd66239457fb33"), ObjectId("554ba28a7fdd66239457fb34") ]
}

ExtJS用户模型

Ext.define('Group',{
    extend: 'Ext.data.Model',
    idProperty : 'id',
    fields:[
        {name:'group_id', type : 'string', mapping : '_id', persist : false},
        {name:'name', type : 'string', mapping : 'name', persist : false}
    ],
    hasMany : { model : 'User', foreignKey:'id' , name : 'users'}
});

用户模型:

Ext.define('User',{
    extend: 'Ext.data.Model',
    idProperty : 'id',
    fields:[
        {name:'id', type : 'string', mapping : '_id', persist : false},
        {name: 'name', type: 'string'},
    ]
});
当我访问group.users();

时,在EXTJS代码中

当我通过提供外键向模型添加关联时,在商店中使用rest方法,它会向GET请求发出

/users?filter=[{"property":"group_id","value":"453490sdkjskldfjlskdjf","exactMatch":true}]

但这是MySQL的一种联想。

如何解决这个问题以适应mongo风格的关联?

所以我基本上希望这种情况发生。现在我打电话的时候 groups.users().load()它使用像这样的过滤器参数向用户代理发出GET请求 /users?filter=[{"property":"group_id","value":"453490sdkjskldfjlskdjf","exactMatch":true}]。但我在用户中没有group_id!因此,它必须根据它在组对象的users属性中找到的ObjectId来查询用户代理。

由于这在基于文档的数据库中非常常见,默认情况下这是否可行?我错过了什么吗? 感谢。

1 个答案:

答案 0 :(得分:0)

关系1:Ext中的许多实现方式与DBMS中的实现方式不同。在DBMS中,我们有两个表(类似于Ext中的存储的构造),并且该关系由链接表之间的记录的外键定义。

在Ext中,我们(可以)在单面(组)上有一个商店,但我们没有一个商店用于多方(用户)。相反,每个组记录都包含一个用户存储。它不是商店的记录字段,但Ext定义了一个getter。

在您的情况下,group.users()会返回包含属于该特定组的用户的商店。当您尝试加载Ext时,Ext的行为与任何其他商店的行为完全相同:group.users().load() - 它只会为该特定外键添加过滤器,因此您无需手动执行此操作。