Если вы знаете индекс в массиве, вы можете получить доступ к элементу массива напрямую, используя точечную нотацию.
update(
{ _id: ObjectId(xxxx) },
{ $set: { 'columns.0.panels.0.top' : 125}}
)
Убедитесь, что вы заключили точечный путь в кавычки в строку.
Редактировать:
Чтобы подробнее узнать о том, как это может работать динамически, я приведу пример на PHP:
$action = array("columns.$colNum.panels.$panelNum" => $newValue);
Да, есть позиционный оператор , но он выглядит недостаточно продвинутым для изменения массивов внутри массивов, это может измениться в MongoDB 1.7.0
Есть альтернатива, которую вы можете сделать вместо этогопытаться вложить эту информацию во вложенный документ.Попробуйте сгладить это.Вы можете создать коллекцию, которая имеет объекты панели и столбца:
объект столбца:
{
_id: // MongoId
type: 'column',
user: 'username',
order: 1,
width: 30,
}
объект панели:
{
_id: //MongoId
type: 'panel',
user: 'username',
parentColumn: //the columns _id string
top: 125,
left: 100
}
Затем вы можете найти все принадлежащие столбцыпользователю:
find({ type: 'column', user:'username'});
Вы можете найти все панели для определенного столбца, выполнив:
find({type: 'panel', columnOwner:'ownerID'});
Поскольку каждый столбец и панель будут иметь уникальный идентификатор, данный MongoDB дляэто, вы можете легко запросить и атомарно установить параметры.
update({'_id': ObjectId('idstring')}, {$set : { 'top' : 125}});