我正在使用基于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来查询用户代理。
由于这在基于文档的数据库中非常常见,默认情况下这是否可行?我错过了什么吗? 感谢。
答案 0 :(得分:0)
关系1:Ext中的许多实现方式与DBMS中的实现方式不同。在DBMS中,我们有两个表(类似于Ext中的存储的构造),并且该关系由链接表之间的记录的外键定义。
在Ext中,我们(可以)在单面(组)上有一个商店,但我们没有一个商店用于多方(用户)。相反,每个组记录都包含一个用户存储。它不是商店的记录字段,但Ext定义了一个getter。
在您的情况下,group.users()
会返回包含属于该特定组的用户的商店。当您尝试加载Ext时,Ext的行为与任何其他商店的行为完全相同:group.users().load()
- 它只会为该特定外键添加过滤器,因此您无需手动执行此操作。