Ich habe ein Dokument, das folgendermaßen strukturiert ist:
{
_id:"43434",
heroes : [
{ nickname : "test", items : ["", "", ""] },
{ nickname : "test2", items : ["", "", ""] },
]
}
Kann ich das zweite Element des Arrays items
des eingebetteten Objekts in heros
mit nickname
$set
"test"
?
Ergebnis:
{
_id:"43434",
heroes : [
{ nickname : "test", items : ["", "new_value", ""] }, // modified here
{ nickname : "test2", items : ["", "", ""] },
]
}
Sie müssen zwei Konzepte verwenden: mongodb's Positionsoperator und einfach den numerischen Index für den Eintrag verwenden, den Sie aktualisieren möchten.
Mit dem Positionsoperator können Sie eine Bedingung wie folgt verwenden:
{"heros.nickname": "test"}
und verweisen Sie dann wie folgt auf den gefundenen Array-Eintrag:
{"heros.$ // <- the dollar represents the first matching array key index
Wenn Sie den zweiten Array-Eintrag in "items" aktualisieren möchten, werden die Array-Schlüssel 0 indiziert - das ist der Schlüssel 1.
So:
> db.denis.insert({_id:"43434", heros : [{ nickname : "test", items : ["", "", ""] }, { nickname : "test2", items : ["", "", ""] }]});
> db.denis.update(
{"heros.nickname": "test"},
{$set: {
"heros.$.items.1": "new_value"
}}
)
> db.denis.find()
{
"_id" : "43434",
"heros" : [
{"nickname" : "test", "items" : ["", "new_value", "" ]},
{"nickname" : "test2", "items" : ["", "", "" ]}
]
}
Diese Lösung funktioniert gut. Ich möchte nur einen Punkt hinzufügen. Hier ist die Struktur. Ich muss feststellen, dass OrderItemId 'yyy' ist und aktualisiere. Wenn das Abfragefeld in condition ein Array ist, wie unten dargestellt, ist "OrderItems.OrderItemId" ein Array. Sie können "OrderItems.OrderItemId [0]" nicht als Operation in der Abfrage verwenden. Stattdessen müssen Sie "OrderItems.OrderItemId" zum Vergleichen verwenden. Andernfalls kann es nicht mit einem übereinstimmen.
{
_id: 'orderid',
OrderItems: [
{
OrderItemId: ['xxxx'],
... },
{
OrderItemId: ['yyyy'],
...},
]
}
result = await collection.updateOne(
{ _id: orderId, "OrderItems.OrderItemId": [orderItemId] },
{ $set: { "OrderItems.$.imgUrl": imgUrl[0], "OrderItems.$.category": category } },
{ upsert: false },
)
console.log(' (result.modifiedCount) ', result.modifiedCount)
console.log(' (result.matchedCount) ', result.matchedCount)
db.collection.update(
{
heroes:{$elemMatch:{ "nickname" : "test"}}},
{
$Push: {
'heroes.$.items': {
$each: ["new_value" ],
$position: 1
}
}
}
)