Se conosci l'indice nell'array puoi accedere all'elemento dell'array direttamente usando la notazione del punto.
update(
{ _id: ObjectId(xxxx) },
{ $set: { 'columns.0.panels.0.top' : 125}}
)
Assicurati di racchiudere il percorso tra virgolette tra virgolette come una stringa.
Modifica:
Per fornire maggiori dettagli su come potrebbe funzionare dinamicamente, fornirò un esempio in PHP:
$action = array("columns.$colNum.panels.$panelNum" => $newValue);
Sì, esiste l'operatore posizionale , ma non sembra essere sufficientemente avanzato per modificare gli array all'interno degli array, questo potrebbe cambiare in MongoDB 1.7.0
C'è un'alternativa che puoi fare invece di provare a inserire queste informazioni in un documento nidificato. Prova ad appiattirlo. Puoi creare una raccolta con oggetti pannello e colonna:
oggetto colonna:
{
_id: // MongoId
type: 'column',
user: 'username',
order: 1,
width: 30,
}
oggetto pannello:
{
_id: //MongoId
type: 'panel',
user: 'username',
parentColumn: //the columns _id string
top: 125,
left: 100
}
Quindi puoi trovare tutte le colonne che appartengono a un utente facendo:
find({ type: 'column', user:'username'});
Puoi trovare tutti i pannelli per una colonna specifica facendo:
find({type: 'panel', columnOwner:'ownerID'});
Poiché ogni colonna e pannello avrà un ID univoco fornito da MongoDB, puoi facilmente eseguire query e impostare le opzioni in modo atomico.
update({'_id': ObjectId('idstring')}, {$set : { 'top' : 125}});