Java morphia:在嵌入数组的对象上向上插入

Java morphia:在嵌入数组的对象上向上插入,java,mongodb,morphia,nosql,Java,Mongodb,Morphia,Nosql,使用Morphia,可以对嵌入在数组中的对象执行saveOrUpdate/upsert操作 考虑以下文件: { _id : "abcd", myArray : [{ "key" : "areaTotal", "value" : "101.9", "label" : "Total area (municipality)" }, { "key" : "areaUrban", "value" : "803",

使用Morphia,可以对嵌入在数组中的对象执行saveOrUpdate/upsert操作

考虑以下文件:

{
_id : "abcd",
myArray : [{
        "key" : "areaTotal",
        "value" : "101.9",
        "label" : "Total area (municipality)"
    }, {
        "key" : "areaUrban",
        "value" : "803",
        "label" : "Total area (urban)"
    }, {
        "key" : "populationDensity",
        "value" : "15991",
        "label" : "Population desnsity"
    }
]
}
是否有一种干净的方法可以用另一个对象替换例如带有键“areaUrban”的数组元素 比如

{
        "key" : "areaUrban",
        "value" : "123",
        "label" : "a new label"
}
目前,我通过两个更新操作完成此操作:首先删除,然后添加:

UpdateOperations<T> ops = createUpdateOperations().removeAll("myArray ", new BasicDBObject("key", "areaUrban")); 
update(createQuery().field("_id").equal(myObjId),ops);
UpdateOperations<T> ops2 = createUpdateOperations().add("myArray ", myReplacementObject); 
update(createQuery().field("_id").equal(myObjId),ops2);
UpdateOperations ops=createUpdateOperations().removeAll(“myArray”,新的基本对象(“key”,“areaUrban”);
更新(createQuery().field(“_id”).equal(myObjId),ops);
UpdateOperations ops2=createUpdateOperations().add(“myArray”,myReplacementObject);
更新(createQuery().field(“_id”).equal(myObjId),ops2);
这很好,但我可以只在一个更新操作中完成吗(使用morphia或普通mongo java驱动程序)

此外,如果匹配对象最初不存在于数组中,则应将myReplacementObject对象添加到数组中

感谢您的光临:


[编辑]正如JohnnyHK在评论中提到的,如果嵌套文档不存在,则不会将其插入。

使用:



[编辑]正如JohnnyHK在评论中提到的那样,如果嵌套文档不存在,则不会上载该文档。

这将适用于upsert的更新部分,但如果它不存在,则不会创建新元素。嗯,很好。看来没办法了。也不允许在一个查询中执行拉/推操作。这里有一个将upsert添加到位置操作符的票证:这将适用于upsert的更新部分,但如果它不存在,则不会创建新元素。嗯,这一点很好。看来没办法了。也不允许在一个查询中执行拉/推操作。此处有一个票证打开,可向位置运算符添加upserts:
db.test.update({_id: "abcd", "myArray.key": "areaUrban"}, {$set: {"myArray.$.value": 123, "myArray.$.label": "a new label"}})