sql >> Database >  >> NoSQL >> MongoDB

Hoe $set sub-sub-array items in MongoDB

Als u de index in de array kent, kunt u rechtstreeks toegang krijgen tot het array-element met behulp van puntnotatie.

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

Zorg ervoor dat u het pad met de punten tussen aanhalingstekens plaatst als een tekenreeks.

Bewerken:

Om meer details te geven over hoe dit dynamisch zou kunnen werken, geef ik een voorbeeld in PHP:

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

Ja, er is de positionele operator , maar het lijkt niet geavanceerd genoeg te zijn om arrays binnen arrays te wijzigen, kan dit veranderen in MongoDB 1.7.0

Er is een alternatief dat u kunt doen in plaats van te proberen deze informatie in een genest document te proppen. Probeer het glad te strijken. U kunt een verzameling maken met paneel- en kolomobjecten:

kolomobject:

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

paneelobject:

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

Dan kunt u alle kolommen vinden die bij een gebruiker horen door te doen:

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

U kunt alle panelen voor een specifieke kolom vinden door:

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

Aangezien elke kolom en elk paneel een unieke ID heeft die door MongoDB eraan is gegeven, kunt u eenvoudig opties opvragen en atomair instellen.

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


  1. Zoeken naar array in ingesloten lijst

  2. meerdere exemplaren van Mongo DB op dezelfde server

  3. MongoDB $sortByCount Aggregation Operator

  4. Kun je mongo $push prepend hebben in plaats van append?