我将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用户可以提供一些建议会很棒。
答案 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会新建一条记录,然后创建新密钥,分配价值。