sql >> Base de Datos >  >> NoSQL >> MongoDB

Cómo $establecer elementos de sub-sub-arreglo en MongoDB

Si conoce el índice de la matriz, puede acceder al elemento de la matriz directamente mediante la notación de puntos.

update(
{ _id: ObjectId(xxxx) },
{ $set: { 'columns.0.panels.0.top' : 125}}
)

Asegúrese de encerrar la ruta anotada con puntos entre comillas como una cadena.

Editar:

Para dar más detalles sobre cómo esto podría funcionar dinámicamente, daré un ejemplo en PHP:

$action = array("columns.$colNum.panels.$panelNum" => $newValue);

Sí, existe el operador posicional , pero no parece ser lo suficientemente avanzado para cambiar arreglos dentro de arreglos, esto puede cambiar en MongoDB 1.7.0

Hay una alternativa que puede hacer en lugar de intentar meter esta información en un documento anidado. Intenta aplanarlo. Puede crear una colección que tenga objetos de panel y columna:

objeto de columna:

{
_id: // MongoId
type: 'column',
user: 'username',
order: 1,
width: 30,
}

objeto del panel:

{
_id: //MongoId
type: 'panel',
user: 'username',
parentColumn: //the columns _id string
top: 125,
left: 100
}

Luego puede encontrar todas las columnas que pertenecen a un usuario haciendo:

find({ type: 'column', user:'username'});

Puede encontrar todos los paneles para una columna específica haciendo:

find({type: 'panel', columnOwner:'ownerID'});

Dado que cada columna y panel tendrá una identificación única otorgada por MongoDB, puede consultar fácilmente y configurar opciones de forma atómica.

update({'_id': ObjectId('idstring')}, {$set : { 'top' : 125}});