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']

...然后使用find()with pictures.107.id => 107,但这对我来说看起来很愚蠢。

有没有更好的方法来实现这一目标?

4

2 回答 2

2

不完全确定您在寻找什么,但我会试一试。

在 MongoDB 中,您可以使用操作符进行原子更新$set,它将仅替换您传递的数据,而不是整个文档。

如果$elemMatch在选择时将其与运算符一起使用,则只能更新urlpictures查询匹配的:

$mongo->selectCollection('mydb', 'favorites')
      ->update(
           array('pictures' => array(
               '$elemMatch' => array('id' => 107),
           )),
           array('$set' => array('pictures.$.url' => 'http://foobar'))
        );

您可以看到更新包含pictures.$.url,其中$指的是与$elemMatch查询匹配的元素。

以上内容会将匹配pictures.url中的所有内容更新为他们的,为您提供如下内容: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 回答