2

次のような 2 つのクラスがあるとします。

public class Person {

    private String personId;

    private String name;

    private Address address;

}

public class Order {

    private String orderId;

    @DbRef
    private Person customer;

}

私がやりたいことは、 Order コレクションに対してクエリを実行することですが、リンクされた Person オブジェクトの特定のフィールドのみを返します。

public Order findByOrderId(String orderId) {
    Query query = query(where("orderId").is(orderId));
    query.fields().exclude("person.address");
    return operations.findOne(query,Order.class);
}

データが返されますが、@DbRef を介してリンクされた子オブジェクトにまたがっている場合、除外引数が適用されないようです。Order オブジェクトの属性を問題なく除外できます。私が抱えている問題は、Person ドキュメントが非常に大きくなる可能性があり、Order オブジェクトを取得するときにネットワーク トラフィックを制御したい (つまり、必要なデータだけを取得する) ことです。

spring-data-mongodb のバージョン 1.0.0.M5 を使用しています

この種の操作がサポートされているかどうかは誰にもわかりませんか?

どうもありがとう

ジョー

4

2 に答える 2

2

これは現在不可能です。その理由は、残念ながらフィールド スペックの引数を取らないメソッドをDBRef使用して、ストアからのオブジェクトを透過的に変換するためです。fetch()MongoDB Java ドライバーのバグ トラッカーと、Spring Data MongoDB のバグ トラッカーでチケットを開いて、導入される可能性のある追加のメソッドを取り上げることをお勧めします。

これを回避するには、ドメイン クラス内でオブジェクトをマップし、ネストされた除外を指定してDBRefトリガーすることにより、実際のオブジェクトに手動で解決することができます。findOne(…)

于 2012-07-09T16:35:56.243 に答える
0

もう 1 つの回避策は、AbstractMongoEventListener を拡張し、onAfterConvert メソッドをオーバーライドして、それを Spring Bean として公開することです。

ここで Order オブジェクトにアクセスでき、null にしたくないものを設定できます。

デフォルト値で空のフィールドを取得できますが、サイズははるかに小さくなります

または、必要なフィールドのみを持つカスタム PersonInfo クラスを作成し、それを Order オブジェクトに設定し、Peson を null に設定することもできます。

于 2012-07-14T11:34:45.080 に答える