Java 如何使用spring mongo数据api更新嵌入式mongo文档

Java 如何使用spring mongo数据api更新嵌入式mongo文档,java,spring,mongodb,mongodb-query,Java,Spring,Mongodb,Mongodb Query,在上述结构中: 我想使用spring数据mongo db API 1.3.4更新“parameterizedValue”,用于带有_id=“caseCodes”和key=“CS\u CAT1”的屏幕 我尝试过(这里“values”是TranslationValue数组的集合名称) 但它说,“不能将数组附加到字符串”字典“ 有什么建议或帮助吗?谢谢 -Sanjeev对于这种类型的更新,您的逻辑和模式存在一些问题 首先,您拥有的是嵌套数组,这会导致操作员文档中描述的更新出现问题。这意味着,任何与up

在上述结构中: 我想使用spring数据mongo db API 1.3.4更新“parameterizedValue”,用于带有_id=“caseCodes”和key=“CS\u CAT1”的屏幕

我尝试过(这里“values”是TranslationValue数组的集合名称)

但它说,“不能将数组附加到字符串”字典“

有什么建议或帮助吗?谢谢


-Sanjeev

对于这种类型的更新,您的逻辑和模式存在一些问题

首先,您拥有的是嵌套数组,这会导致操作员文档中描述的更新出现问题。这意味着,任何与update语句查询端的数组元素相匹配的条件都只会与找到的第一个数组索引相匹配

由于您需要内部数组中的特定条目,因此也需要匹配该条目。但是“catch”表示位置运算符中只使用第一个匹配项,因此不能同时使用这两个项。查询表单(如果可以工作,但不能工作)实际上类似于以下内容(本机shell):

db.collection.update(
{ 
“屏幕编号”:“案例代码”,
“屏幕.字典.键”:“CS_CAT1”
},
{
“$set”:{
“屏幕.$.dictionary.$.parameterizedValue”:“新值”
}
}
)
现在,这看起来比您现在所做的更正确,但这当然失败了,因为位置运算符不能被多次使用。在这种情况下,我可能会非常愚蠢地工作,因为碰巧“screens”数组的第一个匹配索引(即0)恰好与内部元素的所需索引完全相同。但实际上这只是“愚蠢的运气”

为了更好地说明,您需要对这些类型的更新执行的操作已经是了解元素的索引,并使用“点表示法”将这些值直接放入update语句中。因此,更新第二个“dictionary”元素将如下所示:

db.collection.update(
{ 
“屏幕编号”:“案例代码”,
“屏幕。字典。键”:“我的调查”
},
{
“$set”:{
“screens.0.dictionary.1.parameterizedValue:“新值”
}
}
)
还要注意的是,这里使用的正确运算符不是附加到任何一个数组,而是希望更改元素

由于更新中的这种精确性不太可能满足您的需要,因此您应该考虑以更受支持的方式更改模式以适应您的操作。因此,一种可能性是您的“屏幕”数据可能不需要是数组,您可以将其更改为文档形式,如下所示:

“屏幕”:{
“案例代码”:[
{
“密钥”:“CS_CAT1”,
“parameterizedValue”:“我的调查”,
“locale”:“en-US”
}, 
{
“关键”:“我的调查”,
“parameterizedValue”:“”,
“区域设置”:“pt BR”
}, 
]
}
这将表格更改为:

db.collection.update(
{ 
“屏幕。案例代码。键”:“CS_CAT1”
},
{
“$set”:{
“屏幕.案例代码.$.parameterizedValue”:“新值”
}
}
)

这可能对您的目的有效,也可能无效,但您可能会受到使用嵌套数组的限制,或者以某种方式更改架构。

谢谢,尼尔。此-“$set”:{“screens.0.dictionary.1.parameteredValue”:“new value”}是否可以将嵌入的文档id字段作为objectID?因此,同一文档中有两个objectID
    I need some help updating property of embedded collection with JSON structure below       -
     translation
    {
     "_id" : ObjectId("533d4c73d86b8977fda970a9"),
     "_class" : "com.xxx.xxx.translation.domain.Translation",
     "locales" : [ 
       {
        "_id" : "en-US",
        "description" : "English (United States)",
        "isActive" : true
       }, 
      {
        "_id" : "pt-BR",
        "description" : "Portuguese (Brazil)",
        "isActive" : true
      }, 
     {
        "_id" : "nl-NL",
        "description" : "Dutch (Netherlands)",
        "isActive" : true
     }
     ],
     "screens" : [ 
     {
        "_id" : "caseCodes",
        "dictionary" : [ 
            {
                "key" : "CS_CAT1",
                "parameterizedValue" : "My investigations",
                "locale" : "en-US"
            }, 
            {
                "key" : "MY_INVESTIGATIONS",
                "parameterizedValue" : "",
                "locale" : "pt-BR"
            }, 
       }
      ]
     }
      mongoOperations.updateFirst(Query.query(Criteria.where("screens._id")
            .is("caseCodes")), new Update().push(
            "screens.dictionary.$.values", translationValue),
            Translation.class);