MongoDB
 sql >> Base de Dados >  >> NoSQL >> MongoDB

Como $ definir itens de sub-sub-array no MongoDB


Se você conhece o índice na matriz, pode acessar o elemento da matriz diretamente usando a notação de ponto.
update(
{ _id: ObjectId(xxxx) },
{ $set: { 'columns.0.panels.0.top' : 125}}
)

Certifique-se de colocar o caminho notado por pontos entre aspas como uma string.

Editar:

Para dar mais detalhes sobre como isso poderia funcionar dinamicamente, vou dar um exemplo em PHP:
$action = array("columns.$colNum.panels.$panelNum" => $newValue);

Sim, existe o operador posicional , mas não parece ser avançado o suficiente para alterar arrays dentro de arrays, isso pode mudar no MongoDB 1.7.0

Existe uma alternativa que você pode fazer em vez de tentar colocar essas informações em um documento aninhado. Tente achatá-lo. Você pode criar uma coleção que tenha objetos de painel e coluna:

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

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

Então você pode encontrar todas as colunas que pertencem a um usuário fazendo:
find({ type: 'column', user:'username'});

Você pode encontrar todos os painéis de uma coluna específica fazendo:
find({type: 'panel', columnOwner:'ownerID'});

Como cada coluna e painel terá um ID exclusivo fornecido pelo MongoDB, você pode facilmente consultar e definir opções atomicamente.
update({'_id': ObjectId('idstring')}, {$set : { 'top' : 125}});