2012-04-30 2 views
1

私は狂っている問題を抱えています!or、およびドット表記を使用したPHP、Mongoクエリー

私は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には結果を得るません!

なぜですか? どうしたの? 正しい構文は何ですか?

ありがとうございました!

+0

どのようにPHPで動作しないと言うことができますか?おそらく、まったく同じクエリを作成しないが、何か別のものを作成するPHPコードを書いたでしょうか?そのクエリをPHPで作成するという証拠を提供してください。あなたのPHPコードを共有し、生成されたクエリ文字列を共有する。 - あなたが共有するクエリは配列であり、シェル内のような文字列ではありません。 – hakre

答えて

3

あなたの構文はうまくいくようですが、主な問題は浮動小数点数が常に正確ではないことです。特に、45.4689と45.468945を自分で混在させる場合は特にそうです。浮動小数点数を直接比較するには、常に小さなファジーファクタを追加する必要があります。

この場合、座標を使用しているようですか?そのような場合、私はあなたをお勧め:ensureIndex(配列(「フィールド」:

  • スワップaとbのフィールド(あなたが経度を取得するように、その後、緯度)
  • は、「フィールド」の2Dインデックスを作成します=> '2d'));
  • 小さい最大距離と1の限界と共に使用geoNear、ポイントのための走査のはるかに優れた方法を与える必要があり

。 geoNearコマンドは$またはを実行できないため、クエリを2回実行する必要があります。

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

+1

こんにちはDerick、そうですよ!はい、彼らは座標です。私はあなたが推測したことをやろうとしていました。あなたは正しいのですが、問題は正確さにあります。実際には、クエリは次のように動作するはずです: "最初の10の結果を取得する。たとえば、ニューヨークまたはミラノに別のフィールドで注文されている"まったく、NYC +ミラノ(その結果、1番目の結果はNYC、2番目のミラノ、3番目の、4番目のNYCです)。文書の総数は膨大で、私は10を組み合わせるだけです。したがって、私は空間クエリを使用することはできません。アプリケーションレベルで結果を集計することもできません。 だから、それは単に不可能ですか? :/ – upanisad

関連する問題