Hier ist die große Frage:Müssen Sie die „addToSet“- und „Push“-Operationen von Mongo nutzen? Wenn Sie wirklich vorhaben, nur einzelne Elemente im Array zu ändern, sollten Sie diese Arrays wahrscheinlich als Objekte erstellen.
Hier ist, wie ich das strukturieren würde:
{
id: 1,
items:
{
"2" : { "blocks" : { "3" : { txt : 'hello' } } },
"5" : { "blocks" : { "1" : { txt : 'foo'}, "2" : { txt : 'bar'} } }
}
}
Dadurch wird im Grunde alles in JSON-Objekte anstelle von Arrays umgewandelt. Sie verlieren die Möglichkeit, $push
zu verwenden und $addToSet
aber ich denke das macht alles einfacher. Ihre Abfrage würde beispielsweise so aussehen:
db.objects.update({'items.2': {$exists:true} }, {'$set': {'items.2.blocks.0.txt': 'hi'}})
Sie werden auch feststellen, dass ich die "IDs" abgelegt habe. Wenn Sie solche Dinge verschachteln, können Sie "ID" im Allgemeinen ersetzen, indem Sie einfach diese Nummer als Index verwenden. Das "ID"-Konzept ist jetzt impliziert.
Diese Funktion wurde in 3.6 mit aussagekräftigen Aktualisierungen hinzugefügt.
db.objects.update( {id: 1 }, { $set: { 'items.$[itm].blocks.$[blk].txt': "hi", } }, { multi: false, arrayFilters: [ { 'itm.id': 2 }, { 'blk.id': 3} ] } )