wake-up-neo.net

Aktualisierungsfeld im genauen Element-Array in MongoDB

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 : ["", "", ""] },
    ]
}
60
Denis Ermolin

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" : ["", "", "" ]}
    ]
}
122
AD7six

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)
0
Kathy
db.collection.update(
{
heroes:{$elemMatch:{ "nickname" : "test"}}},
 {
     $Push: {
        'heroes.$.items': {
           $each: ["new_value" ],
           $position: 1
        }
     }
   }

)
0
Rubin Porwal