2013-07-18 3 views
2

Я хочу поблагодарить всех, кто помог мне в прошлом, а также ваше время, чтобы прочитать этот пост.MySQL To Mongodb query issue

У меня проблема с преобразованием моего запроса sql в запрос mongodb.

SQL запросов:

SELECT m_time,m_latency FROM pkt_tbl WHERE (m_time-m_latency+" . LATENCY_DELTA . ")>=" . $rangeXFrom . " AND (m_time-m_latency+" . LATENCY_DELTA . ")<=" . $rangeXTo . " ORDER BY (m_time-m_latency+" . LATENCY_DELTA . ")" 

MongoDB Query (My Try)

$latency_delta_split = array('m_time-m_latency'=>LATENCY_DELTA); 
$find_query = array($latency_delta_split=>array('$gte'=>$rangeXFrom),$latency_delta_split=>array('$lte'=>$rangeXTo)); 
$find_projectins = array('m_time'=>1, 'm_latency'=>1); $find_query = array(('m_time-m_latency'=>LATENCY_DELTA)=>array('$gte'=>$rangeXFrom),('m_time-m_latency'=>LATENCY_DELTA)=>array('$lte'=>$rangeXTo)); 

Я все еще получаю сообщение об ошибке и не могли выяснить решение.

То, что я сделал:

1] Read Mongodb Docs. 
2] Searched on StackOverflow for similar problems. (None addressed mine) 
3] Refered to PHP.NET official docs. 

Однако, я не мог понять, Помощь будут оценены.

+0

Какая ошибка возникает из-за ошибки? –

+0

запрос не запускается. И я уверен, что в запросе есть ошибка. (Я еще не делал ORDER BY, но у меня был написан запрос, который наверняка будет содержать ошибки. Если кто-то может помочь мне указать, что это было бы здорово. –

+0

Да, но какая СПЕЦИФИЧЕСКАЯ ошибка вы получаете. Mondo, и вы не получаете никаких результатов, вы смотрите на то, какую ошибку вы получаете (т.е. что-то более конкретное, чем «оно не работает»)? –

ответ

7

В вашем SQL у вас есть: m_time-m_latency, который, как я полагаю, означает вычитание одного столбца из другого.

Короткий ответ:

Это не то, что вы можете представить с MongoDB запросов еще, как вы можете сравнивать только поля со статическими значениями.

Длинный ответ:

Если вы хотите найти документы, где m_time - m_latency + LATENCY_DELTA находится в определенном диапазоне, то вам нужно будет хранить это значение предварительно рассчитанных в другой области документа. Если вы сделаете это, то вы можете просто выполнить запрос с:

db.collection.find({ 'm_calculated_latency' : { '$gte' : FROM_RANGE, '$lte' : TO_RANGE } }); 

Или в PHP:

$collection->find(array(
    'm_calculated_latency' => array(
     '$gte' => $from_range, 
     '$lte' => $to_range, 
    ) 
) 

Обойти:

С рамками агрегации MongoDB, вы, вероятно, можете сделать запрос, как вы хотите, но это далеко не самое быстрое или самое элегантное решение, и он также не использует индекс. Итак, , пожалуйста, перепроектируйте вашу схему и добавьте это предварительно вычисленное поле.

С предупреждением из пути, здесь идет:

FROM=3 
TO=5 
DELTA=1 
db.so.aggregate([ 
    { $project: { 
     'time': { $add: [ 
      { $subtract: [ '$m_time', '$m_latency' ] }, 
      DELTA 
     ] }, 
     'm_time' : 1, 
     'm_latency' : 1 
    } }, 
    { $match: { 'time' : { $gte: FROM, $lte: TO } } }, 
    { $sort: { 'time' : 1 } } 
]); 

В $ проект шаг, мы расчета времени поля как m_time - m_latency + DELTA.Мы также выводим исходные поля m_time и m_latency. А затем в шаге $ мы сравниваем вычисленный time с FROM или TO. И, наконец, сортируем по расчетному time. (Поскольку ваш исходный тип SQL тоже не имеет смысла, я предположил, что вы хотите сортировать по разнице во времени).

С моим входных данных:

> db.so.insert({ m_time: 5, m_latency: 3 }); 
> db.so.insert({ m_time: 5, m_latency: 1 }); 
> db.so.insert({ m_time: 8, m_latency: 1 }); 
> db.so.insert({ m_time: 8, m_latency: 3 }); 
> db.so.insert({ m_time: 7, m_latency: 2 }); 
> db.so.insert({ m_time: 7, m_latency: 4 }); 
> db.so.insert({ m_time: 7, m_latency: 6 }); 
> FROM=3 
> TO=5 
> DELTA=1 

Это производит:

{ 
    "result" : [ 
     { 
      "_id" : ObjectId("51e7988af4f32a33dac184e8"), 
      "m_time" : 5, 
      "m_latency" : 3, 
      "time" : 3 
     }, 
     { 
      "_id" : ObjectId("51e7989af4f32a33dac184ed"), 
      "m_time" : 7, 
      "m_latency" : 4, 
      "time" : 4 
     }, 
     { 
      "_id" : ObjectId("51e7988cf4f32a33dac184e9"), 
      "m_time" : 5, 
      "m_latency" : 1, 
      "time" : 5 
     } 
    ], 
    "ok" : 1 
} 

Теперь последний Хитрость заключается в том, чтобы написать совокупный запрос из выше в синтаксисе PHP, который, как вы можете видеть довольно тривиален :

<?php 
$m = new MongoClient; 
$db = $m->test; 

$r = $db->so->aggregate([ 
    [ '$project' => [ 
     'time' => [ '$add' => [ 
      [ '$subtract' => [ '$m_time', '$m_latency' ] ], 
      $DELTA 
     ] ], 
     'm_time' => 1, 
     'm_latency' => 1 
    ] ], 
    [ '$match' => [ 'time' => [ '$gte' => $FROM, '$lte' => $TO ] ] ], 
    [ '$sort' => [ 'time' => 1 ] ] 
]); 
var_dump($r); 
?> 
+0

Большое вам спасибо! –

0

Это не имеет никакого смысла. Вы не можете цепи вместе => при определении ключевых пар значений в тех случаях, как это:

('m_time-m_latency'=>LATENCY_DELTA)=>array('$gte'=>$rangeXFrom) 

Я честно не уверен, что вы пытаетесь сделать там, чтобы дать лучший совет.

+0

Благодарим за отзыв. У меня SQL-запрос, я пытаюсь написать запрос mongodb для этого. Я написал несколько простых, но этот выглядит сложным. Не знаю, как это решить. –