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 не может выполнить $ или.

Если у вас есть только дискретный набор точек (как, кажется, указывают ваши комментарии), то я бы рекомендовал не запрашивать числа с плавающей запятой, а просто добавить поле с названием города.

Другие вопросы по тегам