2013-07-10 3 views
1

J'ai un document de compte qui ressemble à ceci:MongoDB (ceci ou cela ou l'autre), mais pas (moi)

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

Et je voudrais vérifier e-mail unique avant de permettre à un utilisateur de créer un Compte. Cependant, je voudrais aussi permettre des sauvegardes pour l'utilisateur actuel _id.

Mon instinct est d'utiliser:

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

Mais cela ne fonctionne pas pour moi. Quelqu'un pourrait-il me montrer comment mettre en place une requête à peu près équivalent à MySQL de:

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

Merci les gars.

+0

Votre $ nin est faux pour un, il devrait être 'field => array ($ nin)' – Sammaye

+0

Merci, je l'ai légèrement modifié, mais en espérant que quelqu'un puisse peser pour montrer comment cette requête est destinée à être écrite. –

+0

essentiellement: $ et ($ ou (email & altemail.email), $ ne (_id))? – WiredPrairie

Répondre

1

Vous pouvez utiliser $ne opérateur au lieu de nin $, de sorte que votre requête ressemblera à ceci:

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

Et le code PHP sera:

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

:/... cela ne fonctionne pas, en fait. Je reçois un enregistrement qui a à la fois une correspondance par e-mail et un match _id, malgré notre $ ne ... peut-être que nous avions besoin d'un $ et? –

+0

Votre variable '$ myID' est-elle une chaîne ou un objet MongoId? –

+0

'$ db-> utilisateurs-> find (array ('$ et' => array ( \t \t \t \t \t \t \t '_id' => array ('$ ne' => new MongoId ("51dc6628e8602982ae33ef77")) , \t \t \t \t \t \t \t '$ ou' => array (array ('email' => "[email protected]"), array ('altemail.email' => "[email protected]")) \t \t \t \t \t \t))); ' Voilà comment je l'ai maintenant écrit et obtenir:' Fatal erreur: Exception non interceptée 'MongoCursorException' avec le message '$ et l'expression doit être un tableau non vide' dans ... ' –

0

Fantastique! Merci à tous ceux qui ont aidé. Le code de Miguel est concis, précis et assez élégant. Voici une dernière explication pour tout le monde qui vient à cette question après moi:

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

Cette requête:

  1. retour (vide) pour un utilisateur qui a actuellement le courrier électronique stocké (pas un doublon)
  2. retour (non vide) pour un utilisateur qui tente de stocker une adresse e-mail non distincte (en double)

Merci encore à tout le monde.