Операция upsert невозможна для встроенного массива.Это должен быть двухэтапный процесс.
Вы сначала (пытаетесь) удалить запись, а затем нажать ее.Или сначала обновите запись, а если это не удалось, вставьте ее.
Первый подход: (сначала удалите его)
db.collection.update(
{ _id : ObjectId("xyz")},
{ $pull: {"items.name": "aaa"}}
)
, затем вставьте его:
db.collection.update(
{ _id : ObjectId("xyz")},
{ $push: {"items": {
name : "ddd",
value: "new value",
description: "new description"
}}
)
Второй подход: (сначала обновите его)
var result = db.collection.update(
{
_id : ObjectId("xyz"),
"items.name": "aaa")
},
{
$set: {"items.$.name": {name: "new name"}}
}
);
А потом, если ничего не обновляется, то вставьте его.
if(!result.nMatched)
{
db.collection.update(
{
_id: ObjectId("xyz"),
"items.name": {$ne: ObjectId("xyz"}}
},
{
$push: {
items: {
name: "new name",
value: "new value",
description: "new description"
}
}
}
);
}