2011-03-28 71 views
1

我正在使用MongoDB,PHP驱动程序和Google Maps。由于Google Maps对Longitude进行了绕圈(在某些情况下,LEFT经度可能会大于RIGHT经度),因此我试图获得相当于MySQL的而不是在MongoDB中的工作。MongoDB等价于“NOT BETWEEN”

有没有人成功地使用了MongoDB的“$或”操作符来模拟NOT BETWEEN?

这里是我的(失败)的尝试至今:

// If the LEFT longitude is greater 
if ($longitude_left > $longitude_right) { 
    $params = array(
     '$or' => array(
      'longitude' => array('$gte' => $longitude_left, '$lte' => $longitude_right) 
     ) 
    ); 
} 
// By default, the RIGHT longitude is greater 
else { 
    $params = array(
     'longitude' => array(
      '$gte' => $longitude_left, '$lte' => $longitude_right 
     ) 
    ); 
} 

$mongo = new Mongo(); 
$cursor = $mongo->energy->plants->find($params); 

回答

3

MongoDB的PHP驱动程序总是接受/预期阵列...

既然你逝去的$ GTE$ LTE太... 阵列都需要在阵列中的$或才能正常工作。

在你的榜样,你传递的第一部分中的数组,但不是$或$ GTE$ LTE 2个数组的数组...

对于示例工作,你需要做类似...

$params = array('$or' => array(
        array('longitude' => array('$gte' => $longitude_left)), 
        array('longitude' => array('$lte' => $longitude_left)) 
        ) 
      ); 

$cursor = $collection->find($params); 
0
NOT BETWEEN (a, b) 

基本上转化为

为$或子句

$lt a 
$gt b 

转换成MongoDB的JSON查询此语法很简单。或者你的问题在哪里?