【问题标题】:MongoDB query does not resultMongoDB 查询没有结果
【发布时间】:2015-04-14 07:35:42
【问题描述】:

我想做一个等价于下面的 SQL 代码:

SELECT * FROM pattern_object_values WHERE (pattern_object_id=1 && value>1977 && 
                                           value<1986)
                                           || (pattern_object_id=2 && value>5000 && 
                                           value<950000);

MongoDB 查询:

$mongoDB->find(array('$or'=>
                            array(
                                array(
                                    '$and'=>array(
                                                array('pattern_object_id'=>1),                                
                                                array('value'=>array('$gte'=>1977,'$lte'=>1986))
                                        )
                                    )
                            ),array(
                                array(
                                    '$and'=>array(
                                                array('pattern_object_id'=>2),                                
                                                array('value'=>array('$gte'=>5000,'$lte'=>95000))
                                        )
                                    )
                                )
                      ));

你能帮帮我吗?

【问题讨论】:

  • 发布具有预期输出的示例文档,以便其他人轻松找出创建的查询是否匹配

标签: php sql mongodb


【解决方案1】:

无需在您的 mongo 查询中使用 $and 运算符,因为来自 docs

MongoDB 在指定逗号时提供隐式 AND 操作 分隔的表达式列表。使用带有 $and 的显式 AND 当必须使用相同的字段或运算符时,运算符是必需的 在多个表达式中指定。

因此这个 SQL 表达式:

SELECT * 
FROM pattern_object_values 
WHERE 
   (pattern_object_id = 1  && value > 1977  && value < 1986 )
|| (pattern_object_id = 2  && value > 5000 && value < 950000 );

有 MongoDB 等价物:

db.pattern_object_values.find({
$or: [ 
         { 
            'pattern_object_id': 1,
            { 
               'value': { '$gt': 1977, '$lt': 1986 } 
            } 
         }, 
         { 
            'pattern_object_id': 2,
            { 
                'value': { '$gt': 5000, '$lt': 950000 } 
            }
         }
     ]  
});

然后您可以将其转换为 PHP 等效项(未经测试)

db->pattern_object_values
  ->find(array('$or' => array(
             array(
                  array('pattern_object_id' => 1),
                  array('value' => array('$gt' => 1977, '$lt' => 1986)
             ),
             array(
                  array('pattern_object_id' => 1),
                  array('value' => array('$gt' => 5000, '$lt' => 950000 )
             )
           )
        )
    );

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-30
    • 2013-06-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-14
    相关资源
    最近更新 更多