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 フィールドを入れ替えます (経度、次に緯度を取得するため)
  • 「フィールド」に 2 次元インデックスを作成します: ensureIndex( array( 'field' => '2d' ) );
  • 小さい最大距離と制限 1 でgeoNearを使用し、

これにより、ポイントをスキャンするはるかに優れた方法が得られるはずです。ただし、geoNear コマンドは $or を実行できないため、クエリを 2 回実行する必要があります。

ポイントの個別のセットしかない場合 (コメントが示すように)、浮動小数点数をクエリするのではなく、単に都市名のフィールドを追加することをお勧めします。

于 2012-04-30T09:31:48.440 に答える