MongoDB автоинкрементный идентификатор с PHP - PullRequest
0 голосов
/ 27 июня 2018

В настоящее время я использую этот php-код для создания собственного идентификатора автоматического приращения в MongoDB.

$mongo = new MongoDB\Driver\Manager("mongodb://10.1.1.111:27017");

$find = [ '_id' => 'campaignid' ];
$query = new MongoDB\Driver\Query($find, [ ]);
$rows = $mongo->executeQuery('testdb.counters', $query);
$arr = $rows->toArray();

$oldId = 0;
if(count($arr) > 0)
{
    $old = array_pop($arr);
    $oldId = intval($old->seq);
}

$nextId = ++$oldId;

$set = [ '_id' => 'campaignid', 'seq' => $nextId ];
$insRec = new MongoDB\Driver\BulkWrite;
$insRec->update($find, ['$set' => $set], ['multi' => false, 'upsert' => true]);
$writeConcern = new MongoDB\Driver\WriteConcern(MongoDB\Driver\WriteConcern::MAJORITY, 1000);
$result = $mongo->executeBulkWrite('testdb.counters', $insRec, $writeConcern);

Я должен получить старый идентификатор, увеличить его и записать обратно. Я думаю, что есть лучший способ с MongoDB \ Driver \ Manager :: executeReadWriteCommand , но я не смог его найти.

Я нашел это , где есть решение с findAndModify, но оно написано для MongoClient, которое устарело .

Есть идеи, как использовать executeReadWriteCommand или, может быть, лучше?

Ответы [ 2 ]

0 голосов
/ 12 ноября 2018

Вот еще одно решение. Допустим, вы хотите сохранить документ и увеличить идентификатор. Вы можете сделать что-то вроде этого:

$mongo->testdb->updateOne(
   ['myidfield' => '123'],
   [
     '$set' => ['name' => 'John'],
     '$inc' => ['id' => 1]
   ],
   [
     'upsert' => true
   ]
);
0 голосов
/ 28 июня 2018

Я нашел решение. Просто хочу поделиться, если кто-то тоже ищет.

Я использовал mongo-php-library , чтобы он работал с новым драйвером MongoDB. Но не с findAndModify, как прокомментировал @malarzm, потому что это только внутренняя функция для FindOneAndXXXX.

Я использовал findOneAndUpdate :

$mongo = new MongoDB\Client("mongodb://10.1.1.111:27017");
$collection = $mongo->testdb->counters;
$result =  $collection->findOneAndUpdate(
            [ '_id' => 'campaignid' ],
            [ '$inc' => [ 'seq' => 1] ],
            [ 'upsert' => true,
              'projection' => [ 'seq' => 1 ],
              'returnDocument' => MongoDB\Operation\FindOneAndUpdate::RETURN_DOCUMENT_AFTER
             ]
);

$nextId = $result['seq'];
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...