6

ストアユーザー通知用に設計されたクラス階層があります。

@Document
public class Notification<T> {
   @Id
   private String id;
   @DBRef
   private T tag;
   ...
}

@Document
public class NotificationA extends Notification<WrappedA> {
}

@Document
public class NotificationB extends Notification<WrappedB> {
}

    ...

これは、多態的な配列を返すのに役立ち、「タグ」フィールドにあらゆる種類のデータを格納できます。問題は、ラップされたオブジェクトに@DBRefフィールドが含まれている場合に始まります。

@Document
public class WrappedA {
   @Id
   private String id;
   @DBRef
   private JetAnotherClass referenced;
   ...
}

「タグ」のフィールドでのクエリは正常に機能します。

db.NotificationA.find( {"tag.$id": ObjectId("507b9902...32a")} )

しかし、JetAnotherClassのフィールド(2つのレベルの@DBRefフィールド)を照会する必要があります。ドット表記とサブオブジェクトを試しましたが、nullが返されます。

ドット表記:

db.NotificationA.findOne( {"tag.$referenced.$id": ObjectId("508a7701...29f")} )

サブオブジェクト:

db.NotificationA.findOne( {"tag.$referenced": { "_id": ObjectId("508a7701...29f") }} )

何か助けはありますか?前もって感謝します!

4

1 に答える 1

7

あなたはあなたがクエリをしているように見えるので、_id私はあなたができると信じています:

db.NotificationA.findOne({"tag.$id": ObjectId("blah")});

でも:

しかし、JetAnotherClassのフィールド(2つのレベルの@DBRefフィールド)を照会する必要があります。

DBRefはJOINではなく_id、リンクコレクションがわからない場合に自己記述するだけなので、ヘルパーオブジェクトが作成されるため、クライアント側でこれを自分でコーディングする必要はありません。

DBRefの詳細については、http://docs.mongodb.org/manual/applications/database-references/を参照してください

基本的に、同じドキュメントからDBRef内のサブフィールドをクエリできます。つまりDBRef.$_id、サーバー側では、そのDBRefを解決して、結果のフィールドをクエリすることはできません。

于 2012-11-13T13:45:41.560 に答える