Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java MongoCollection:无法更新嵌套文档_Java_Mongodb - Fatal编程技术网

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.$”)
并在应用程序代码中拾取内部值。