Mongodb - использование $, обновление значения в подмассиве - PullRequest
0 голосов
/ 27 марта 2012

У меня есть коллекция (favorites) с документами, которые выглядят следующим образом:

{
    "_id" : 907,
    "pictures" : [
        {
        "id" : 107,
        "url" : "http://url1",
        "title" : "some title"
        },
        {
        "id" : 111,
        "url" : "http://url2",
        "title" : "some other title"
        }
    ]
}

Довольно просто получить URL-адреса, используя pictures.url.

Но как это сделать?Я обновляю URL для всех пользователей, которые сохранили картинку с id=111 в качестве своего любимого?

Я нашел обходной путь, используя:

107:['id':107,'url':'http://url1','title':'some title']

... и затем используя find() с pictures.107.id => 107, но мне это кажется глупым.

Есть ли лучший способ добиться этого?

Ответы [ 2 ]

2 голосов
/ 27 марта 2012

Не совсем уверен, что вы ищете, но я попробую.

В 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
    }
] }
1 голос
/ 27 марта 2012
db.favorites.update({pictures: {$elemMatch:{id:111}}}, {'pictures.$.title':"Some Title"}, false, true)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...