2013-07-10 1 views
1

У меня есть документ счета, который выглядит следующим образом:MongoDB (это или что OR другой), но НЕ (я)

_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 => ($ nin)' – Sammaye

+0

Спасибо, я немного изменил его, но все же надеялся, что кто-то может взвесить, чтобы показать, как этот запрос должен быть написан. –

+0

в основном: $ и ($ или (электронная почта и 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-> users-> найти (массив ('$ и' => массив ( \t \t \t \t \t \t \t '_id' => Array ('$ пе' => новый Mongoid ("51dc6628e8602982ae33ef77")) , \t \t \t \t \t \t \t '$ или' => Array (массив ('электронная почта' => "[email protected]"), массив ('altemail.email' => "[email protected]")) \t \t \t \t \t \t))); ' это, как я теперь это написано, и получение:' Фатальная error: Uncaught exception «MongoCursorException» с сообщением «$ и выражение должно быть непустым массивом» в ... ' –

0

Fantastic! Спасибо всем, кто помог. Код Мигеля является кратким, точным и довольно элегантным. Вот окончательное объяснение для тех, кто приходит на этот вопрос после того, как я:

$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. возвращение (не пустой) для пользователя, который пытается сохранить, не отчетливый адрес электронной почты (дубликат)

Еще раз спасибо всем.