morphia:upsert on嵌入在数组中的Object

时间:2013-01-06 22:02:52

标签: java mongodb morphia nosql

使用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);

哪个工作正常,但是我可以只在一个更新操作中使用(使用morphia或使用普通的mongo java驱动程序)吗?

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

感谢

1 个答案:

答案 0 :(得分:1)

使用$ positional operator

db.test.update({_id: "abcd", "myArray.key": "areaUrban"}, {$set: {"myArray.$.value": 123, "myArray.$.label": "a new label"}})

<小时/> [编辑]正如JohnnyHK在评论中提到的那样,如果嵌套文档不存在,则不会将其嵌套。