0

次のように定義されたオブジェクト化エンティティがあります。

public class MyEntity1
{
    @Id @Indexed String             phoneNumber;
    @Parent @Indexed Key<MyEntity2> parentEntityKey;
}

電話番号でフィルタリングしようとすると、次のエラー メッセージが表示されます。

Cannot (yet) filter by @Id fields on entities which have @Parent fields.

この構成の理由は、phoneNumber と parentEntityKey の両方を知っている場合に (クエリを実行する代わりに) これらのレコードを取得できるようにするためです。他のいくつかのケースでは、私は phoneNumber だけを知っていて、それを照会したいと考えています。

これは Objectify または Datastore の欠点ですか?回避策はありますか? 私の 2 つの要件 (両方の値がわかっている場合はクエリの代わりに取得し、それのみがわかっている場合は phoneNumber でクエリを実行する) を解決する提案はありますか?

4

1 に答える 1

2

これがデータストア キーの性質です。

キーの ID 部分でフィルタリングすることはできません。キー全体でフィルタリングすることも、interior() クエリを使用してキー階層で「フィルタリング」することもできますが、キーの @Id 部分だけでフィルタリングすることはできません。BigTable でキーがどのように配置されているかを考えてみてください。

/parentkind1/parentid1/parentkind2/parentid2/kind/id

id 部分だけで範囲スキャンを実行することはできません。

@Id フィールドとは別に、インデックス付きの phoneNumber プロパティをエンティティに作成する必要があるようです。はい、重複データですが、何があっても別のインデックスが必要なため、BLOB にシリアル化された余分なデータはほとんど無視できます。

トランザクション内でインデックス付きのプロパティに対してクエリを実行することはできず、クエリには結果整合性の動作があることに注意してください。電話番号を一意に割り当てる必要がある場合は、@Id が電話番号そのものである @Parent を使用せずに、別の PhoneNumber エンティティを作成する必要があります。XG トランザクションを使用すると、この一意性エンティティを作成し、単一の一貫した操作で MyEntity1 に関連付けることができます。

于 2012-04-05T16:22:41.760 に答える