MongoDB Java 无法使用键名中的点访问嵌套文档

MongoDB Java nested documents not accessible using dots in key name

在 Java 中使用 MongoDB API 时,我试图在如下所示的文档中检索 two 的值:

data-id: "1234"
one:
    two: "three"

我是运行这个:

MongoCollection<Document> documents = ...;
Document document = documents.find(Filters.eq("data-id", "1234")).first(); // Not null
document.get("one"); // Not null
document.get("one.two"); // This is null
((Document) document.get("one")).get("two"); // Not null

在花了一些时间阅读文档和其他 Stack Overflow 问题后,我了解到在键名中使用点(例如 one.two 键)应该有效,但它不适合我。

MongoDB 允许在字段名称中使用点。

document.get("one.two");

实际上会寻找像

这样的字段
data-id: "1234"
"one.two": "three"

其中 "one.two" 是一个简单字段,而不是嵌入文档。

After spending some time reading documentation and other Stack Overflow questions, I learned that using dots in the key name (like one.two for the key) should work, but it isn't for me.

点符号在 find 方法的查询过滤器中使用时效果很好。例如,

Document document = collection.find(Filters.eq("one.two", "three")).first();
System.out.println(document);    // prints the returned document

或其 mongo shell 等价物:

db.collection.find( { "one.two": "three" } )


Document class 的 get() 方法将 Object(字符串键)作为参数,returns 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}}}} 显示有 三个 键:_iddata-idone。请注意,有 no 键名为 one.two。关键字 two 位于文档的子文档 中 ,关键字为 one.

因此,根据您的代码:

document.get("one.two");    // This is null ((Document)
document.get("one")).get("two"); // Not null

第一个语句returnsnull,下一个returnsthree(字符串值)。两者都是 正确 结果,这就是 Documentclass API.

的行为

您应该使用方法 getEmbedded 来访问嵌入字段 one.two。因此,将 document.get("one.two") 替换为

document.getEmbedded(Arrays.asList("one", "two"), String.class)

结果是 "three",符合预期。