Почему этот запрос обновления обновляет только одну запись

$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.

Это поведение по умолчанию для MongoDB для обновлений. Если вы хотите обновить сразу несколько документов, вам явно нужно предоставить флаг multi :

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

так что вам придется использовать

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

вместо.

Из документации :

Если вы исходите из SQL, имейте в виду, что по умолчанию update () изменяет только первый согласованный объект. Если вы хотите изменить все согласованные объекты, вам нужно использовать флаг multi.

Поскольку это было сделано в 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 ); 

Теперь MongoDB использует updateMany для обновления нескольких документов: db.collection.updateMany (,,)

  db.collection.updateMany(criteria, objNew)