MongoDB PHP:如果不存在等效的插入

时间:2012-03-10 14:50:41

标签: php mongodb

我将MongoDB与PHP一起使用。要为每个用户创建唯一文档,我使用

将用户名设置为唯一
$db->ensureIndex(array("username" => 1), array("unique" => 1, "dropDups" => 1));

但是,如果存在重复,则为用户返回的_id值是从未创建的记录的值,而不是db中已存在的记录的值。

这是整个功能:

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 :(得分:0)

首先,您始终需要try...catch。您为_id获取错误$user_doc的原因仅仅是驱动程序在将其发送到数据库之前创建它。因此,即使插入失败,它仍然在文档上。

  

如何创建没有重复用户名的用户数据库?

我首先要用用户名覆盖_id字段。 _id是自动生成的,但您可以在插入之前自行设置。

您仍然需要使用try...catch,但您会收到特定的重复键错误。然后,您可以使用它来正确处理“该用户名已存在”的情况。

答案 1 :(得分:0)

如果不存在,我将如何设置插入。

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

这基本上只是在记录存在时更新(“更新”到它已经设置的内容并且$setOnInsert什么都不做),但是如果它不存在,mongo会新建一条记录,然后创建新密钥,分配价值。