Mongodb - 使用$,更新子数组中的值

时间:2012-03-27 13:16:31

标签: mongodb mongodb-php

我有一个集合(favorites),其文档如下所示:

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

使用pictures.url获取网址非常容易。

但是如何更新所有用id=111保存图片的用户的网址?

我找到了一个解决方法:

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

...然后将find()pictures.107.id => 107一起使用,但这看起来很愚蠢。

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

2 个答案:

答案 0 :(得分:2)

不完全确定你要找的是什么,但我会试一试。

在MongoDB中,您可以使用$set运算符执行atomic updates,该运算符将仅替换您传递的数据,而不是整个文档。

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

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

答案 1 :(得分:1)

db.favorites.update({pictures: {$elemMatch:{id:111}}}, {'pictures.$.title':"Some Title"}, false, true)