2011-10-17 29 views
0

我对Google App Engine中的低级数据存储有一点点但重要的疑问。 我需要的文档结构是这样的:作为gae-datastore中索引映射的属性

{infNfe id="1234" 
    det={nItem="1",prod="prodname"}, 
    det={nItem="2",prod="prodname"}, 
    det={nItem="3",prod="prodname"} 
} 

注意DET元素是地图太大,但不幸的是数据存储不接受Map作为索引财产。

锁定一些例子,我发现类似的东西:

Entity i = new Entity("infNfe","key"); 
i.setProperty("id",1234); 
Entity det1 = new Entity("det",i.getKey()); 
det1.setProperty("nItem",1); 
det1.setProperty("prod","prodname"); 
..Others dests.. 

但是,当我查询了一些子实体,我会得到不完整引用。

Query dq= new Query("det"); 
dq.setAncestor(i.getKey()); 
..Printing result.. 
{nItem="1",prod="prodname"} 

通过这种方法,我可以一次只得到一个DET实体。 我怎样才能一次获得父母和孩子?

感谢.....

回答

0

与孩子方法的问题是,你最终有很多实体,因为你每GET/PUT /查询结果按照新的支付(至少这意味着更多的成本价钱)。

Objectify是一个伟大的框架,用于执行这些查询。要做到用客观化的地图,创建第二个类两种类型要映射:

class Det 
{ 
    long nItem; 
    String prod; 
} 

class InfNfe 
{ 
    @Id Long id; 
    @Embedded List<Det> dets; 
} 

它将然后存储数据,如以下

id = 1 
dets.nItem = [1, 2, 3, 4] 
dets.prod = ["A", "B", "C", "D"] 

与客体,则可以指定哪些项目被索引,你可以基于这些数据进行查询(尽管我不知道它如何管理查询数组中间的数据)。