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}}}}
显示有 三个 键:_id
、data-id
和 one
。请注意,有 no 键名为 one.two
。关键字 two
位于文档的子文档 中 ,关键字为 one
.
因此,根据您的代码:
document.get("one.two"); // This is null ((Document)
document.get("one")).get("two"); // Not null
第一个语句returnsnull
,下一个returnsthree
(字符串值)。两者都是 正确 结果,这就是 Document
class API.
的行为
您应该使用方法 getEmbedded
来访问嵌入字段 one.two
。因此,将 document.get("one.two")
替换为
document.getEmbedded(Arrays.asList("one", "two"), String.class)
结果是 "three",符合预期。
在 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}}}}
显示有 三个 键:_id
、data-id
和 one
。请注意,有 no 键名为 one.two
。关键字 two
位于文档的子文档 中 ,关键字为 one
.
因此,根据您的代码:
document.get("one.two"); // This is null ((Document)
document.get("one")).get("two"); // Not null
第一个语句returnsnull
,下一个returnsthree
(字符串值)。两者都是 正确 结果,这就是 Document
class API.
您应该使用方法 getEmbedded
来访问嵌入字段 one.two
。因此,将 document.get("one.two")
替换为
document.getEmbedded(Arrays.asList("one", "two"), String.class)
结果是 "three",符合预期。