不会导致MongoDB查询

时间:2015-04-14 07:35:42

标签: php sql mongodb

我想制作以下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))
                                        )
                                    )
                                )
                      ));

你能帮帮我吗?

1 个答案:

答案 0 :(得分:0)

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

  

MongoDB在指定逗号时提供隐式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 )
             )
           )
        )
    );