属性作为gae-datastore中的索引映射

时间:2011-10-17 16:07:27

标签: java google-app-engine google-cloud-datastore

我对Google App Engine的低级数据存储有一点但又重要的疑问。 我需要一个像这样的文档结构:

{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 实体。 我怎样才能立刻得到父母和孩子?

感谢.....

1 个答案:

答案 0 :(得分:0)

子方法的问题在于你最终会有很多实体,这意味着更多的成本,因为你按每个获取/放置/查询结果付费(至少在新定价下)。

Objectify是执行这些查询的绝佳框架。要使用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"]

使用Objectify,您可以指定哪些项被编入索引,并且您可以根据这些数据进行查询(尽管我不知道它如何设法在数组中间查询数据)。