我有一个集合(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
一起使用,但这看起来很愚蠢。
有没有更好的方法来实现这一目标?
答案 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)