为什么这个更新查询只更新一条记录一次


Why this update query only update one record once

$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为时间戳整数,status为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标志。

现在MongoDB正在使用updateMany更新多个文档:db.collection。updateMany(,,)

    db.collection.updateMany(criteria, objNew)

由于这最初是在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
);