php mongodb查询后找到_id

时间:2012-08-24 13:45:56

标签: php mongodb

我正在从mysqli转换为mongodb并在基本任务方面遇到一些问题 这是登录验证过程的一部分,如果电子邮件和密码与dB中的记录集匹配,我希望得到_id并创建会话变量。

到目前为止,我所做的所有搜索似乎都有从不同步骤获取_id的信息,我无法根据我的情况对其进行修改。

另外,如果我的逻辑太过于mysqli的翻译,那么我愿意就noSql的最佳做法提出建议

$collection = $db->members;
$query = array("email" => $email, "password" => $newpass);
  //$cursor = $collection->findOne($query);  // was told this is better but need deeper understanding
$cursor = $collection->find($query); 
$result = $cursor->count();

if($result==1){
    $_SESSION['email'] = $email;

    //having problems here
    $id = $cursor->findOne(array("_id" => $query['_id']));
    $_SESSION['id'] = $id;

    return true; 
}else 
    return false;

问题如何在验证唯一的用户名和密码后获取_id

2 个答案:

答案 0 :(得分:4)

您不应该在光标上运行findOne。光标指向上一个查询的结果,您可以使用iterator_to_array获取包含所有找到的记录的数组。或者您可以首先使用findOne() - 它返回实际的行

$collection = $db->members;
$query = array("email" => $email, "password" => $newpass);
$result = $collection->findOne($query);

if(!empty($result)){
    $_SESSION['email'] = $email;

    //having problems here
    $id = "" . $result['_id']; // cast to string, as its a MongoId object
    $_SESSION['id'] = $id;

    return true; 
}else 
    return false;

答案 1 :(得分:4)

您可以确保查询的唯一性(对于登录系统更好)。

因此请使用findOne()。它会返回文档。请记住,在MongoDb中,您可以获得文档或文档游标。

检查文档,您只能返回部分文档。 Official Documentation

$doc = $col->findOne(
       array('pass'=> $pass, 'email'=>$email),//select
       array('_id'=>1)//field selection
);
if ($doc){
   //do your session stuff
}