2013-07-10 24 views
1

我有一个帐户的文件看起来像这样:MongoDB的(这种或那种或其他),但(我)

_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);

谢谢你们。

+0

你的$ nin对一个是错误的,它应该是'field => array($ nin)' – Sammaye

+0

谢谢,我稍微修改了它,但仍然希望有人能够权衡显示这个查询是如何写入的。 –

+0

基本上:$和($或(email&altemail.email),$ ne(_id))? – WiredPrairie

回答

1

你可以使用$ne操盘$万年,因此您的查询将是这样的:

{ 
    "$or": [ 
     { 
      "email": "[email protected]" 
     }, 
     { 
      "altemail.email": "[email protected]" 
     } 
    ], 
    "_id": { 
     $ne: "123456" 
    } 
} 

而且PHP代码将是:

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

:/ ...实际上这不起作用。我得到一个记录,既有电子邮件匹配又有_id匹配,尽管我们的$ ne ...也许我们需要一个$和? –

+0

您的'$ myID'变量是字符串还是MongoId对象? –

+0

'$ DB->用户 - >找到(阵列( '$和'=>数组( \t \t \t \t \t \t \t '_id'=>数组( '$ NE'=>新MongoId( “51dc6628e8602982ae33ef77”)) , \t \t \t \t \t \t \t '$或'=>数组(阵列( '电子邮件'=> “[email protected]”),阵列( 'altemail.email'=> “[email protected]”) ) \t \t \t \t \t \t)));' 这是怎样我现在有它写在纸上,并得到:'致命错误:在......' –

0

太棒了! 感谢所有帮助过我的人。 Miguel的代码简洁,准确,相当优雅。 这里的每个人都是一个最终解释谁后,我谈到了这个问题:

$email = "[email protected]";      //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. 回报(不为空)的是谁试图存储非不同电子邮件地址的用户(重复)

再次谢谢大家。

相关问题