Не совсем уверен, что вы ищете, но я попробую.
В MongoDB вы можете атомарные обновления с оператором $set
, который заменит только передаваемые вами данные, а не весь документ.
Если вы используете его с оператором $elemMatch
при выборе, вы можете обновить только url
из pictures
, которые соответствуют вашему запросу:
$mongo->selectCollection('mydb', 'favorites')
->update(
array('pictures' => array(
'$elemMatch' => array('id' => 107),
)),
array('$set' => array('pictures.$.url' => 'http://foobar'))
);
Как видите, обновление содержит pictures.$.url
, где $
относится к элементу (ам), который соответствует запросу $elemMatch
.
Выше будут обновлены все pictures.url
в вашем favorites
, которые соответствуют 111
как их pictures.id
, давая вам что-то вроде:
{ "_id" : 907, "pictures" : [
{
"id" : 107,
"url" : "http://url1",
"title" : "some title"
},
{
"id" : 111,
"title" : "some other title",
"url" : "http://foobar" // only this one has matched
}
] }