2011-12-20 50 views
4
$coll->update(
    array(
    "uid"=(int)$uid, 
    "status"=>1, 
    "time"=>array('$gt'=>0,'$lte'=>$time) 
), 
    array(
    '$set'=>array("status"=>0) 
) 
); 

如果您无法读取PHP,以上代码的CLI版本:为什么此更新查询只更新一个记录一次

db.we.update({"uid":1,"status":1,"time":{"$lte":1324403899}},{"$set":{status:0}}) 

其中time是时间戳整数,状态为int 0或1 。

回答

10

这是更新的MongoDB默认行为。如果你想一次更新多个文档,你会明确必须提供标志:

db.collection.update(criteria, objNew, upsert, multi) 

,所以你不得不使用

db.we.update({"uid":1, "status":1, "time" : {"$lte":1324403899}}, 
      {"$set":{status:0}}, 
      false, 
      true); 

代替。

documentation

如果是从SQL来了,要知道,在默认情况下,更新()仅修改第一个匹配的对象。如果你想修改所有匹配的对象,你需要使用多标志。

+0

非常感谢。非常明确的答案。上投了反对票。对于那些在PHP中可能面临同样问题的人,添加选项的方法是在更新函数中追加数组(“multiple”=> ture)。 – LotusH 2011-12-20 18:52:56

0

看到,因为这是在做PHP最初,这可以使用PHP是使用的任何人:

$collection->update(

    array("uid"=>(int)$uid,"status"=>1,"time"=>array('$gt'=>0,'$lte'=>$time)), //search criteria 

    array('$set'=>array('status'=>0)), //update criteria 

    array('multiple'=>true) //options 

); 
0

现在MongoDB是使用updateMany更新多个文件: db.collection.updateMany(, ,)

db.collection.updateMany(criteria, objNew)