0

favorites次のようなドキュメントを含むコレクション ( ) があります。

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

を使用して URL だけを取得するのはかなり簡単pictures.urlです。

id=111しかし、写真をお気に入りとして保存したすべてのユーザーの URL を更新するにはどうすればよいでしょうか?

次を使用して回避策を見つけました:

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

...そして with を使用find()pictures.107.id => 107ますが、それはばかげているように見えます。

これを達成するためのより良い方法はありますか?

4

2 に答える 2

2

あなたが何を探しているのか完全にはわかりませんが、試してみます。

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をtheir として更新し、次のようになります。favorites111pictures.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
    }
] }
于 2012-03-27T14:19:52.670 に答える
1
db.favorites.update({pictures: {$elemMatch:{id:111}}}, {'pictures.$.title':"Some Title"}, false, true)
于 2012-03-27T14:20:17.700 に答える