MongoDB PHP: вставить, если не существует эквивалент - PullRequest
0 голосов
/ 10 марта 2012

Я использую MongoDB вместе с PHP.Чтобы создать уникальный документ для каждого пользователя, я устанавливаю уникальное имя пользователя с

$db->ensureIndex(array("username" => 1), array("unique" => 1, "dropDups" => 1));

Однако, если есть дубликат, значение _id, возвращаемое для пользователя, равно значению записи, которая получиланикогда не создавался, а не записи, которая уже существует в БД.

Вот вся функция:

function register_user($username, $password, $first_name, $last_name, $email)
{    
$m = new Mongo();
$db = $m->users->details;
$db->ensureIndex(array("username" => 1), array("unique" => 1, "dropDups" => 1));
$user_doc = array( "username" => $username, "password" => $password, "first_name" => $first_name, "last_name" => $last_name, "email" => $email);
$db->insert($user_doc);
return $user_doc["_id"]; // here i return the _id
}

Как мне создать базу данных пользователей, в которой нет повторяющихся имен пользователей??

РЕДАКТИРОВАТЬ:

Вот мое временное решение.Я положил его туда, где раньше была вставка.

try 
  {
      $db->insert($user_doc,array('safe'=>1));
  }
  catch ( MongoCursorException $e ) 
  {
      // if this did not work, we already have that user inside and want to get his _id
      $user = $db->findOne(array('username' => $username, 'password' => $password));
      return $user["_id"];
  }

Если я попытаюсь вставить ее с помощью безопасной опции, она всегда умрет.Используя процедуру try-catch, я пытаюсь вставить и, если она не работает, вручную найти _id по имени пользователя.Я все еще не удовлетворен этим решением, поэтому было бы здорово, если бы более опытные пользователи MongoDB могли бы дать какой-то совет.

Ответы [ 2 ]

0 голосов
/ 13 марта 2015

Вот как мне удается вставить, если не существует.

    $db->update(
            array('email' => $email),
            array('$setOnInsert' => array('email' => $email)),
            array('upsert' => true)
        );

Это в основном просто обновляется, когда запись существует («обновляя» до того, что она уже установлена, и $ setOnInsert ничего не делает), но если она не существует, Монго вставляет новую запись, затем создает новый ключ и присваивает значение.

0 голосов
/ 11 марта 2012

Прежде всего, вам всегда нужно это try...catch.Причина, по которой вы получили неправильный _id для $user_doc, заключается просто в том, что драйвер создает его перед отправкой в ​​базу данных.Таким образом, даже если вставка не удалась, она все еще находится в документе.

Как мне создать базу данных пользователей, в которой нет повторяющихся имен пользователей?

Я бы начал сперезаписать поле _id именем пользователя._id создается автоматически для удобства, но вы можете установить его самостоятельно перед вставкой.

Вам все равно нужно будет использовать try...catch, но вы получите конкретную ошибку дублирующегося ключа.Затем вы можете использовать это, чтобы правильно обработать случай «это имя пользователя уже существует» .

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