Als u de index in de array kent, kunt u rechtstreeks toegang krijgen tot het array-element met behulp van puntnotatie.
update(
{ _id: ObjectId(xxxx) },
{ $set: { 'columns.0.panels.0.top' : 125}}
)
Zorg ervoor dat u het pad met de punten tussen aanhalingstekens plaatst als een tekenreeks.
Bewerken:
Om meer details te geven over hoe dit dynamisch zou kunnen werken, geef ik een voorbeeld in PHP:
$action = array("columns.$colNum.panels.$panelNum" => $newValue);
Ja, er is de positionele operator , maar het lijkt niet geavanceerd genoeg te zijn om arrays binnen arrays te wijzigen, kan dit veranderen in MongoDB 1.7.0
Er is een alternatief dat u kunt doen in plaats van te proberen deze informatie in een genest document te proppen. Probeer het glad te strijken. U kunt een verzameling maken met paneel- en kolomobjecten:
kolomobject:
{
_id: // MongoId
type: 'column',
user: 'username',
order: 1,
width: 30,
}
paneelobject:
{
_id: //MongoId
type: 'panel',
user: 'username',
parentColumn: //the columns _id string
top: 125,
left: 100
}
Dan kunt u alle kolommen vinden die bij een gebruiker horen door te doen:
find({ type: 'column', user:'username'});
U kunt alle panelen voor een specifieke kolom vinden door:
find({type: 'panel', columnOwner:'ownerID'});
Aangezien elke kolom en elk paneel een unieke ID heeft die door MongoDB eraan is gegeven, kunt u eenvoudig opties opvragen en atomair instellen.
update({'_id': ObjectId('idstring')}, {$set : { 'top' : 125}});