1

次のようなアカウント ドキュメントがあります。

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

みんなありがとう。

4

2 に答える 2

1

$nin の代わりに operator を使用できる$neため、クエリは次のようになります。

{
    "$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)
)); 
于 2013-07-10T17:27:50.047 に答える
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. 明確でない電子メール アドレス (重複) を保存しようとしているユーザーの戻り値 (空ではない)

改めまして、皆様に感謝申し上げます。

于 2013-07-12T21:32:41.567 に答える