1

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"
}

今のところ、最初に削除してから追加する2つの更新操作で実行します。

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

これは正常に機能しますが、1つの更新操作(morphiaまたはプレーンなmongo javaドライバーのいずれか)でのみ実行できますか?

また、一致するオブジェクトが元々配列に存在していなかった場合は、myReplacementObjectオブジェクトを配列に追加する必要があります。

ありがとう

4

1 に答える 1

1

$位置演算子を使用すると:

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


[編集]JohnnyHKがコメントで述べているように、ネストされたドキュメントが存在しない場合、これはネストされたドキュメントをアップサートしません。

于 2013-01-07T02:11:12.643 に答える