ドット表記は、find内で使用すると正常に機能します メソッドのクエリフィルター。たとえば、
Document document = collection.find(Filters.eq("one.two", "three")).first();
System.out.println(document); // prints the returned document
またはそのmongo 同等のシェル:
db.collection.find( { "one.two": "three" } )
ドキュメント
クラスのget() メソッドはObjectを取ります (文字列キー)をパラメータとして使用し、Objectを返します 。
コードを考えてみましょう:
Document doc = coll.find(eq("data-id", "1234")).first();
System.out.println(doc);
出力Document{{_id=1.0, data-id=1234, one=Document{{two=three}}}} 3つあることを示しています キー:_id 、data-id およびone 。 ないことに注意してください one.twoという名前のキー 。キーtwo サブドキュメント内 キーoneを持つドキュメントの 。
だから、あなたのコードから:
document.get("one.two"); // This is null ((Document)
document.get("one")).get("two"); // Not null
最初のステートメントはnullを返します 、次のものはthreeを返します (文字列値)。どちらも正しい 結果とそれがDocumentの動作です クラスAPI。
getEmbeddedメソッドを使用する必要があります 埋め込みフィールドone.twoにアクセスするには 。したがって、document.get("one.two")を置き換えます と
document.getEmbedded(Arrays.asList("one", "two"), String.class)
結果は、予想どおり「3」になります。