{lang: 'hu'}

Ha egy collection-ben a dokumentumunk egyik propertyje egy tömb, akkor kicsit kacifántosabb egy tömbön belüli elem lekérdezése és frissítése. A lekérdezésre ott van a map/reduce funkció. A frissítésre pedig használhatjuk a már megszokott update függvényt a positional operator-al ötvözve. Böngésztem a netet, de én hasonló példát nem láttam, úgyhogy lássuk! Tegyük fel, hogy a következő struktúránk van a photos collection-ben:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
{
   "userId": 1,
   "albums": {
      "1": {
         albumDefault: 1,
         photos: [{
            photoId: 1,
            photoDescription: "Alma"
            ...
         }, {
            photoId: 2,
            photoDescription: "Körte"
            ...
         }{
            photoId: 3,
            photoDescription: "Barack"
            ...
         }]
      }
   }
}

Ha szeretnénk módosítani pl. a 3-as photoId-vel rendelkező kép leírását, akkor a következő utasítással érhetjük el:

1
2
3
4
5
6
7
8
db.photos.update({ 
   "userId": 1, 
   "albums.1.photos.photoId": 3 
}, { 
   "$set": {
      "albums.1.photos.$.photoDescription": "Szőlő"
   } 
});

És egy megvalósítás php-ben is:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
$mongo = new Mongo();
$db = $mongo->test_db;
$photos = $db->photos;
$condition = array(
   "userId" => 1, 
   "albums.1.photos.photoId" => 3
);
$fieldToUpdate = array(
   "$set" => array(
      "albums.1.photos.$.photoDescription" => "Szőlő"
   )
);
 
$photos->update($condition, $fieldToUpdate);