如何在mongodb中基于_id
更新YII?
我试过的是
$model= new MongoUrls();
$criteria = new EMongoCriteria;
$criteria->userid('==', $userid);
$criteria->screenshot_path('!=', null);
$criteria->screenshot_uploaded('!=', 1);
$availablescreenshots=$model-> findAll($criteria);
if(count($availablescreenshots)>0){
foreach($availablescreenshots as $obj1){
$path_parts = pathinfo($obj1->screenshot_path);
if($social->upload($obj1->screenshot_path, 'test',$path_parts['basename'])) {
$model->updateAll(array('_id'=>$obj1->_id ), array('screenshot_uploaded'=>1) );
}
}
}
但它在Yii中显示错误"The EMongoDocument cannot be updated because it is new."
。
我想更新_id
匹配相同值的文档
答案 0 :(得分:1)
如果我正确地假设您正在使用的扩展名,那么您实际上需要$model->updateAll()
,因为update()
涉及更新当前活动记录而不是运行常规查询。这有点令人困惑,但这是Yii的工作方式。
答案 1 :(得分:1)
作为yii mongosuite docs states,updateAll的使用方式与通常的更新略有不同。此外,您正在使用循环中的updateAll,并且条件是您传递单个ID,这实际上没有意义。使用updateAll,您可以使用条件来更新模型。在这里你应该像这样使用部分更新:
// _id is already set because it comes from db
$obj1->screenshot_uploaded = 1;
// First param to set fields which should be updated
// Set second param to true, to make partial update
$obj1->update(array('screenshot_uploaded'), true);
答案 2 :(得分:0)
对我有用的方法是
$modifier = new EMongoModifier();
$modifier->addModifier('screenshot_uploaded', 'set', '1');
$criteria = new EMongoCriteria();
$criteria->addCond('_id','==', $obj1->_id );
$model->updateAll($modifier,$criteria );