PHP, монго запрос с использованием или и точечной нотации
У меня проблема, которая сводит меня с ума!
Мне нужно перевести следующий запрос Монго в PHP:
db.mycollection.find({$or: [ {'field.a': 45.4689, 'field.b': 9.18103}, {'field.a' : 40.71455, 'field.b': -74.007124} ]})
Отлично работает из оболочки.
Я думаю, что запрос должен быть переведен в PHP следующим образом (var_dump):
Array
(
[$or] => Array
(
[0] => Array
(
[field.a] => 45.468945
[field.b] => 9.18103
)
[1] => Array
(
[field.a] => 40.71455
[field.b] => -74.007124
)
)
)
но я не получаю результатов в PHP!
Зачем? В чем дело? Какой правильный синтаксис?
Спасибо!
1 ответ
Ваш синтаксис кажется мне подходящим, я думаю, что главная проблема в том, что вы используете числа с плавающей запятой, которые не всегда так точны, как вы думаете, особенно если вы смешиваете 45.4689 и 45.468945 самостоятельно. Для прямого сравнения чисел с плавающей запятой всегда следует добавлять небольшой коэффициент размытия.
В этом случае вы, кажется, используете координаты? Если это так, я предлагаю вам:
- поменяйте местами поля a и b (чтобы получить долготу, а затем широту)
- создать 2d-индекс для "поля": sureIndex( array( 'field' => '2d'));
- использовать geoNear с небольшим максимальным расстоянием и пределом 1,
Это должно дать гораздо лучший способ сканирования точек. Однако вам придется выполнить запрос дважды, поскольку команда geoNear не может выполнить $ или.
Если у вас есть только дискретный набор точек (как, кажется, указывают ваши комментарии), то я бы рекомендовал не запрашивать числа с плавающей запятой, а просто добавить поле с названием города.