В настоящее время я использую этот 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 \ Менеджер :: executeReadWriteCommand, но я не смог его найти.
я нашел этот где решение с findAndModify
, но написано для MongoClient, который осуждается.
Любые идеи, как использовать executeReadWriteCommand
или может быть лучше?
Я нашел решение. Просто хочу поделиться, если кто-то тоже ищет.
я использовал Монго-PHP-библиотека заставить его работать с новым драйвером 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'];
Вот еще одно решение. Допустим, вы хотите сохранить документ и увеличить идентификатор. Вы можете сделать что-то вроде этого:
$mongo->testdb->updateOne(
['myidfield' => '123'],
[
'$set' => ['name' => 'John'],
'$inc' => ['id' => 1]
],
[
'upsert' => true
]
);