我想要的是什么:
我的所作所为:
// fresh data
print_r(iterator_to_array($collection->find()->limit(2)));
// query
$docs = $collection->find()->limit(2);
// fetch
foreach ( $docs AS $id => $doc ) {
// update
$collection->update(array('_id' => $doc['_id']), array(
'$set' => array(
'existing_field' => 'x',
'new_field' => 'y',
),
), array('multiple' => false));
}
// verify
print_r(iterator_to_array($collection->find()->limit(2)));
为什么没有做任何事情?现有字段未更改,并且未添加新字段。条件可能是错的吗?
PS。完整的代码(中间有很多垃圾):http://pastebin.com/CNfCVxex
第33-37行 - 新数据
第63-76行 - 查询,获取&更新
第79-80行 - 验证
答案 0 :(得分:1)
不熟悉您在此处使用的驱动程序,但根据您的描述,您可以在单个数据库命中中实现您想要的功能,无需获取/循环/更新..
$ set运算符将根据字段是否存在来插入或更新字段。
db.Collection.update({}, { $set : { "myfield" : "x" } }, false, true)
上面会将集合中所有文档中的“myfield”字段设置为“x”,或者如果它已经存在,则会将值更改为“x”。那是你想要实现的目标吗?
答案 1 :(得分:0)
我怀疑您需要使用$doc['_id']
将字符串new MongoId
转换回MongoId。请参阅本页底部的示例:http://www.php.net/manual/en/class.mongoid.php