2

実行している比較的複雑なクエリがあります。以下にそれを含めましたが、基本的には、位置クエリと $or および $in クエリを組み合わせて、すべて日付/時刻で並べ替えています。完全なクエリを実行すると、降順ではなく昇順で返されます。

クエリの場所の部分を引き出すと、適切な順序で結果が正常に返されますが、クエリの場所のコンポーネントを元に戻すと、引き続き失敗します。

phpで書かれたクエリは次のとおりです。

$query = array( 
        '$or' => array(
            array( ISPUBLIC => true ), 
            array( GROUP_INVITES.".".TO.".".INVITE_VAL => array( '$in' => $user_groups ) )
        ),
        LOC => array( '$near' => array( (float)$lon , (float)$lat ), '$maxDistance' => 1 )  //Using 1 degree for the max distance for now
    );

$res = $this->db->find( $query )->sort(array('ts'=>-1))->limit($limit)->skip($start);

使用されるフィールドは、データベース内のフィールドにマップされる定数です。私の最初の仮定は、インデックスが適切に構成されていないということでしたが、地理空間クエリを他のクエリと組み合わせるときに、これをどのようにインデックス化すればよいでしょうか?

アップデート

クエリを次のように単純化することで、問題を再現できました。

$query = array( 
    HOLLER_GROUP_INVITES.".".HOLLER_TO.".".INVITE_VAL => array( '$in' => $user_groups ),
    HOLLER_LOC => array( '$near' => array( (float)$lon , (float)$lat ), '$maxDistance' => 1 )
);

更新 2

追加のテストを実行しましたが、制限が削除されると正しい方向にソートされるようです。ここで何が起こっているのかわかりません。

4

1 に答える 1

1

この質問には答えがあるようです: MongoDB GeoNearの結果を距離以外で並べ替えますか? .... どうやら $near は既にソートを実行していたようです。特定の境界内に制限し、別のものでソートしたいだけの場合は、$near の代わりに $within を使用する必要があります。

于 2011-10-10T22:45:35.270 に答える