私はSpring Data MongoDBプロジェクトでSpring Bootで作業していましたが、私は明確ではない動作を見ています。 idフィールドはhttp://docs.spring.io/spring-data/mongodb/docs/current/reference/html/#mapping.conventions.id-fieldごとにMongoリポジトリの_idに移動することを理解しています。私の問題は、正しいと思われない子エンティティにとっても起こっているようだということです。私はこれらのクラス(簡潔にするためにセッターとゲッターを除外)は例えばSpringでのフィールド処理Spring Data Mongo for children objects
:私は保存するために、適切なMongoRepositoryクラスを使用し
public class MessageBuild {
@Id
private String id;
private String name;
private TopLevelMessage.MessageType messageType;
private TopLevelMessage message;
}
public interface TopLevelMessage {
public enum MessageType {
MapData
}
}
public class MapData implements TopLevelMessage {
private String layerType;
private Vector<Intersection> intersections;
private Vector<RoadSegment> roadSegments;
}
public class RoadSegment {
private int id;
private String name;
private Double laneWidth;
}
を、私はこれを使用してオブジェクトグラフを作成し、私は例のドキュメントで終わりますこのような(_classが取り残さ付き):この場合
{
"_id" : ObjectId("57c0c05568a6c4941830a626"),
"_class" : "com.etranssystems.coreobjects.persistable.MessageBuild",
"name" : "TestMessage",
"messageType" : "MapData",
"message" : {
"layerType" : "IntersectionData",
"roadSegments" : [
{
"_id" : 2001,
"name" : "Road Segment 1",
"laneWidth" : 3.3
}
]
}
}
フィールドという名前のIDを持つ子オブジェクトのマッピングはMongoDBのリポジトリに_idに変換しています。期待されていないが、世界の終わりではない。最大の問題は、これがREST MVCによって公開され、_idフィールドがクエリから返されていないことです。私はこのクラスのために私のRepositoryRestConfigurerAdapterのexposeIdsForを設定しようとしましたが、それは最上位レベルのドキュメントのidを公開しますが、子のものは公開しません。だから私は持っている2つの質問/問題を周回
は以下のとおりです。
- はなぜ_idにマップされ、子オブジェクトのフィールドですか?私の理解では、これはトップレベルでのみ起こるはずです。なぜなら、下にあるものは、実際には自分の権利の文書ではないからです。
- idフィールドを公開する設定は、フィールド名をマッピングする場合、ドキュメント内の子オブジェクトに対して機能しませんか?
私にとってこれは最上位レベルのドキュメントでのみ意味があります。なぜドキュメントの一部である子エンティティの値が変換されるのでしょうか? –
また、ドキュメントには「MongoDBでは、すべてのドキュメントに_idフィールドが必要です」というメッセージがあり、子エンティティはNOTドキュメントです。それらは挿入される文書の一部です。 –
あなたは私を落胆させました。(ハードな気持ちはなく、私は「なぜ」に答えなかったのでしょうか?)しかし、記録のためには、それはトップレベルで意味をなさないことに同意します。これは非常によくバグかもしれませんか? – alexbt