>我正在尝试用php查询Meteor.users()集合。到目前为止,我能够使用电子邮件地址获取用户ID。现在我想将密码添加到查询中,但无法正确构造查询。
这是我到目前为止所拥有的:
try {
$mongoDb = $mongoConn->xxxxxxxx;
$collection = $mongoDb->users;
//$userQuery = array('emails.address' => $user, "services" => array ( "password" => array( "bcrypt" => $pass )));
$userQuery = array('emails.address' => $user);
$arr = $collection->findOne($userQuery);
} catch (MongoException $e) {
die('Error: ' . $e->getMessage());
}
$id = $arr[_id];
以下是在Mongo中设置密码部分的方式:
"services" : {
"password" : {
"bcrypt" : "$2a$10$lYaK1PDTmRTvpddOX5R08Ooupdczktve/qgUMhFvwKfvpPUk3kEH2"
}
},
"emails" : [{
"address" : "demo@demo.com",
"verified" : false
}]
我已经尝试了点表示法和括号表示法的不同组合services=>password=>bcrypt
但到目前为止我无法进入那里。关于如何查询该部分的任何想法?
"点表示法"语法与您对文档中的数组元素所做的完全相同。所以:
$userQuery = array(
'emails.address' => $user,
'services.password.bcrypt' => $pass
);
也就是说,您之前的尝试:
"services" => array ( "password" => array( "bcrypt" => $pass ))
应该可以工作,但需要注意的是,文档中的对象"必须完全匹配"所表示的结构,并且不存在其他"子键",因为这是您要求查询引擎要求的。
您可能面临的唯一另一个问题是,如果您使用"纯文本"密码作为输入,那么您生成的加密字符串与存储的字符串不匹配。
在后一种情况下,您需要测试加密的生成,以找到使用与用于存储数据完全相同的加密哈希的方法。但这与用于"查询"数据的语法完全不同。