MongoDB(这个OR或其他)但不是(我)

时间:2013-07-10 16:43:39

标签: mongodb mongodb-php

我有一个如下所示的帐户文档:

_id: ###
email: string
password: md5(string)
altemail: [{ email: string
             verified: time},
           { email: string
             verified: time},
           { ... }]

我想在允许用户创建帐户之前检查唯一的电子邮件。但是,我还想允许当前用户_id的保存。

我的直觉是使用:

$db->users->find(array(
                    '$or' => array(array("email" => $email), 
                             array("altemail.email" => $email))
                    '_id' => array('$nin' => array($myID))
                )); 

但这不适合我。 有人可以告诉我如何设置一个大致相当于mysql的查询:

SELECT *, count(_id) FROM users WHERE (email = $email OR altemail.email = $email) AND (_id != $myID);

谢谢你们。

2 个答案:

答案 0 :(得分:1)

您可以使用$ne运算符代替$ nin,因此您的查询将如下所示:

{
    "$or": [
        {
            "email": "test@test.com"
        },
        {
            "altemail.email": "test@test.com"
        }
    ],
    "_id": {
        $ne: "123456"
    }
}

php代码将是:

$db->users->find(array(
    '$or' => array(
                array("email" => $email), 
                array("altemail.email" => $email)
             ),
    '_id' => array('$ne' => $myID)
)); 

答案 1 :(得分:0)

优秀! 谢谢所有帮助过的人。 Miguel的代码简洁,准确,非常优雅。 以下是对我之后提出这个问题的人的最终解释:

$email = "name@domain.com";                       //example email
$myID = new MongoId("51dc6628e8602982ae33ef77");  //example id

$db->users->find(array(
'$or' => array(
            array("email" => $email), 
            array("altemail.email" => $email)
         ),
'_id' => array('$ne' => $myID)
)); 

此查询将:

  1. 为当前存储电子邮件的用户(不是重复的)返回(空)
  2. 为尝试存储不同的电子邮件地址(重复)的用户返回(非空)
  3. 再次感谢大家。