【问题标题】:MongoDB (this OR that OR the other) but NOT (me)MongoDB(这个或那个或另一个)但不是(我)
【发布时间】:2013-07-10 16:43:38
【问题描述】:

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

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

谢谢大家。

【问题讨论】:

  • 你的$nin 错了,应该是field => array($nin)
  • 谢谢,我稍微修改了一下,但仍然希望有人能参与说明这个查询是如何编写的。
  • 基本上:$and( $or(email & altemail.email), $ne(_id))?
  • 就像现在一样,如果您更正 $nin 它应该可以正常工作,尽管正如@WiredPrairie 所说,$ne 实际上可能更好
  • @WiredPrairie 这就是你的建议吗? $db->users->find('$and' => array( '$or' => array(array('email'=>$email),array('altemail.email'=>$email)), '_id' => array('$ne' => $myID) ));

标签: mongodb mongodb-php


【解决方案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)
)); 

【讨论】:

  • :/ ...这实际上是行不通的。尽管我们的 $ne... 也许我们需要一个 $and 吗?
  • 你的 $myID 变量是字符串还是 MongoId 对象?
  • $db->users->find(array('$and'=>array( '_id' => array('$ne' => new MongoId("51dc6628e8602982ae33ef77")), '$or' => array(array('email'=>"abc@def.com"),array('altemail.email'=>"abc@def.com")) ))); 这就是我现在写它的方式,并得到:Fatal error: Uncaught exception 'MongoCursorException' with message '$and expression must be a nonempty array' in...
  • $and value 应该是一个数组,就像 $or 一样。但是这里没有理由用$and,$and的效果就是我之前展示的json
【解决方案2】:

太棒了! 感谢所有帮助过的人。 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. 返回(非空)为尝试存储不明确的电子邮件地址(重复)的用户

再次感谢大家。

【讨论】:

    猜你喜欢
    • 2023-03-23
    • 1970-01-01
    • 2019-03-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-21
    • 2021-10-07
    • 1970-01-01
    相关资源
    最近更新 更多