Почему этот запрос на обновление обновляет только одну запись один раз - PullRequest
4 голосов
/ 20 декабря 2011
$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.

Ответы [ 3 ]

10 голосов
/ 20 декабря 2011

Это поведение по умолчанию для обновлений 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.

1 голос
/ 18 декабря 2017

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

    db.collection.updateMany(criteria, objNew)
0 голосов
/ 02 октября 2013

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

);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...