2

我有一个让我抓狂的问题!

我需要在 PHP 中翻译以下 Mongo 查询:

db.mycollection.find({$or: [ {'field.a': 45.4689, 'field.b': 9.18103}, {'field.a' : 40.71455, 'field.b': -74.007124} ]})

它可以从外壳完美运行。

我认为查询应该通过以下方式(var_dump)翻译成 PHP:

Array
    (
        [$or] => Array
            (
                [0] => Array
                    (
                        [field.a] => 45.468945
                        [field.b] => 9.18103
                    )

                [1] => Array
                    (
                        [field.a] => 40.71455
                        [field.b] => -74.007124
                    )

            )

    )

但我在 PHP 中没有得到任何结果!

为什么?怎么了?什么是正确的语法?

谢谢!

4

1 回答 1

3

你的语法对我来说似乎很好,我认为主要问题是你使用的浮点数并不总是像你想象的那么准确 - 特别是如果你自己混淆了 45.4689 和 45.468945。对于浮点数的直接比较,您应该始终添加一个小的模糊因子。

在这种情况下,您似乎正在使用坐标?如果是这种情况,我建议你:

  • 交换 a 和 b 字段(这样你得到经度,然后是纬度)
  • 在“field”上创建一个二维索引: ensureIndex(array('field' => '2d'));
  • 使用最大距离较小且限制为 1 的geoNear

这应该提供一种更好的扫描点的方法。不过,您必须运行两次查询,因为 geoNear 命令不能执行 $or。

如果您只有一组离散的点(就像您的评论似乎表明的那样),那么我建议不要查询浮点数,而只需添加一个命名城市的字段。

于 2012-04-30T09:31:48.440 回答