Java MongoCollection:无法更新嵌套文档
我正在尝试更新嵌套文档Java MongoCollection:无法更新嵌套文档,java,mongodb,Java,Mongodb,我正在尝试更新嵌套文档 Document{{_id=59837be4324fb01040068109, idKey=2323, objects=[Document{{24889=Document{{key1=val1, key2=val2}}}}]}} json表单如下所示 { "_id": "59837be4324fb01040068109", "idKey": 2323, "objects": [{ "24889": { "k
Document{{_id=59837be4324fb01040068109, idKey=2323, objects=[Document{{24889=Document{{key1=val1, key2=val2}}}}]}}
json表单如下所示
{
"_id": "59837be4324fb01040068109",
"idKey": 2323,
"objects": [{
"24889": {
"key1": "val1",
"key2": "val2"
}
}]
}
我试图更新为
String innerKey="24889";
mongoCollection.updateOne(eq("idKey", 2323),new Document("$set", new Document("objects."+innerKey+".key2", "val3")));
但是如果我这样做了
Document updatedDoc = mongoCollection.find(eq("idKey", 2323)).first();
我明白了
为什么对象没有得到更新?为什么我有
null
s?您不能通过命名键(24889)访问对象,因此如果您事先知道位置,可以尝试
mongoCollection.updateOne(eq("idKey", 2323),new Document("$set", new Document("objects.0."+innerKey+".key2", "val3")));
更好的方法是更新文档以包含键。差不多
{
"_id": "59837be4324fb01040068109",
"idKey": 2323,
"objects": [
{
"name": "24889",
"value": {
"key1": "val1",
"key2": "val2"
}
}
]
}
和使用
`您无法通过命名键(24889)访问对象,因此如果您事先知道位置,可以尝试
mongoCollection.updateOne(eq("idKey", 2323),new Document("$set", new Document("objects.0."+innerKey+".key2", "val3")));
更好的方法是更新文档以包含键。差不多
{
"_id": "59837be4324fb01040068109",
"idKey": 2323,
"objects": [
{
"name": "24889",
"value": {
"key1": "val1",
"key2": "val2"
}
}
]
}
和使用
`您能粘贴一些有效的JSON数据吗?您的示例数据看起来更像实体的toString()版本?谢谢,我在上面添加了json格式。我的更新命令看起来合理吗?您能粘贴一些有效的json数据吗?您的示例数据看起来更像实体的toString()版本?谢谢,我在上面添加了json格式。我的更新命令看起来合理吗?您在“objects.0”+innerKey+“.key2”,“val3”中的数字0后面缺少一个点谢谢!成功了。只是一个小小的调整,我不得不使用Updates.set()
,顺便问一下,有没有类似的方法来获取内键的值?如果我不想更新,只想得到值呢?我试着将and过滤器放入find()
方法中,但它总是能为我提供完整的文档。我应该注意到,我静态地导入了Updates
类,以便在前面的评论中使用set
方法。我认为在第一种情况下是不可能的,但您可以使用类似于第二种情况的mongoCollection.find(and(eq(“idKey”,2323),eq(“objects.name”,innerKey))).projection(projects.include(“objects.$”)
并在应用程序代码中选择内部值。您在“objects.0”+innerKey+“.key2”中的数字0后面缺少一个点,“val3”谢谢!这很有效。只是一个小小的调整,我不得不使用Updates.set()
顺便问一下,有没有类似的方法可以让我获取内部键的值?如果不是更新,我只是想获取值呢?我试着将and过滤器放入find()中
方法,但它总是为我提供完整的文档不客气。我应该注意到,我静态导入了更新
类以使用set
方法进行早期评论。我认为在第一种情况下不可能,但在第二种情况下可以使用类似的mongoCollection.find(and)(eq(“idKey”),2323),eq(“objects.name”,innerKey)))。投影(projects.include(“objects.$”)
并在应用程序代码中拾取内部值。