次のようなアイテムを含むコレクションがMongoDBにあります。
_{
"_id" : ObjectId("53e4d31d1f6b66e5163962e3c"),
"name" : "bob",
"nestedObject" : {
"_id" : ObjectId("53f5a623cb5e4c1ed4f6ce67")
//more fields...
}
}
_
このアイテムのJava表現は次のようになります。
_public class SomeObject {
@Id
private String id;
private String name;
private NestedObject nestedObject;
//getters and setters
}
_
リポジトリインターフェイスは次のように定義されます。
_public interface SomeObjectRepository extends MongoRepository<SomeObject, String> {
public List<SomeObject> findByName(String name);
public List<SomeObject> findByNestedObjectId(String id);
//some other find functions
}
_
現在、findByName(String name)
は正常に機能していますが、findByNestedObjectId(String id)
は何も返しません。
質問は:リポジトリインターフェイスを使用して、ネストされたオブジェクトの属性によってコレクションアイテムを見つけることは可能ですか?そうでない場合、この問題に取り組むための推奨される方法は何ですか?リポジトリ全体を再実装せずに可能ですか?
Spring-data-mongodb
は_ idフィールドをObjectIdに変換しませんクエリ操作時にネストされたクラスに自動的に入力します。手動で変換する必要があります。例えば:
public List<SomeObject> findByNestedObjectId(String id) {
Query query = Query.query(new Criteria("nestedObject._id", convertToObjectId(id)));
return mongoTemplate.find(query, SomeObject.class);
}
Object convertToObjectId(Object id) {
if (id instanceof String && ObjectId.isValid(id)) {
return new ObjectId(id);
}
return id;
}
私はこれを解決する方法を考え出しました。
パラメータタイプをorg.bson.types.ObjectIdに変更します。文字列から
public List<SomeObject> findByNestedObjectId(ObjectId id);
そしてあなたがそれを使うとき
repositoryName.findByNestedObjectId(new ObjectId(theIdString));
NestedObject
が次のようになっている場合:
class NestedObject {
@Id String id;
}
クエリに渡すString
値は、有効なObjectId
クエリです。
findByNestdObjectId(String id);
動作するはずです。チケットを自由に作成できない場合は [〜#〜] jira [〜#〜] そしてそれを再現するための小さなテストケースを提供してください。
ネストされたオブジェクトIDはに変換する必要があります
org.bson.types.ObjectId
次に、ObjectIdをリポジトリメソッドで使用できます
findAllByNestedObject_Id(ObjectId)
私はSpring-bootに以下を使用しています。私にとって魅力のように機能します:
@Query("nestedObjectProperty.$id : ?0")
これは1.6.2spring-data-mongodbで機能しました。しかし、最新バージョンに問題があります。
public interface SomeObjectRepository extends MongoRepository<SomeObject, String> {
public List<SomeObject> findByName(String name);
@Query("nestedObjectProperty._id : { $oid : ?0}")
public List<SomeObject> findByNestedObjectId(String id);
//some other find functions
}
リポジトリで使用されるmongoDBクエリは@Queryで指定できます。私は100%ではありません。以下のクエリは正確ですが、これに沿ったものです。
public interface SomeObjectRepository extends MongoRepository<SomeObject, String> {
public List<SomeObject> findByName(String name);
@Query("{nestedObject._id : ?0}")
public List<SomeObject> findByNestedObjectId(String id);
//some other find functions
}