MongoDB
 sql >> Datenbank >  >> NoSQL >> MongoDB

So legen Sie Sub-Sub-Array-Elemente in MongoDB fest

Wenn Sie den Index im Array kennen, können Sie mit der Punktnotation direkt auf das Arrayelement zugreifen.

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

Stellen Sie sicher, dass Sie den punktnotierten Pfad als Zeichenfolge in Anführungszeichen setzen.

Bearbeiten:

Um mehr Details darüber zu geben, wie dies dynamisch funktionieren könnte, gebe ich ein Beispiel in PHP:

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

Ja, es gibt den Positionsoperator , aber es scheint nicht ausgereift genug zu sein um Arrays innerhalb von Arrays zu ändern, kann sich dies in MongoDB 1.7.0 ändern

Es gibt eine Alternative, die Sie tun können, anstatt zu versuchen, diese Informationen in ein verschachteltes Dokument zu stopfen. Versuchen Sie, es zu glätten. Sie können eine Sammlung mit Panel- und Spaltenobjekten erstellen:

Spaltenobjekt:

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

Panel-Objekt:

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

Dann können Sie alle Spalten finden, die zu einem Benutzer gehören, indem Sie Folgendes tun:

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

Sie können alle Panels für eine bestimmte Spalte finden, indem Sie Folgendes tun:

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

Da jede Spalte und jedes Panel eine eindeutige ID hat, die ihr von MongoDB gegeben wird, können Sie Optionen einfach abfragen und atomar festlegen.

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