sql >> データベース >  >> NoSQL >> MongoDB

距離が可変のMongoDbニア/ジオニアクエリ

    ドキュメントごとの距離を動的に設定できないため、通常のクエリではこれを行うことはできません。 MongoDB 2.4では、パイプラインの開始にgeoNear演算子が追加されているため、集約フレームワークを使用してこれを行うことができます。

    最初のステージは、geonearコマンドと非常によく似たgeoNearになります。結果として、指定されたポイント(10,10)からドキュメントまでの距離も取得されます。

    第2段階では、プロジェクトオペレーターを使用して、maximumDistanceフィールドと計算されたgeoNear距離の差を広告する必要があります。

    最後に、正のデルタ((max-distance)> 0)を持つドキュメントを照合します。

    これが、非同期Javaドライバー を使用したパイプラインです。 のヘルパークラス。

    package example;
    
    import static com.allanbank.mongodb.builder.AggregationProjectFields.include;
    import static com.allanbank.mongodb.builder.QueryBuilder.where;
    import static com.allanbank.mongodb.builder.expression.Expressions.field;
    import static com.allanbank.mongodb.builder.expression.Expressions.set;
    import static com.allanbank.mongodb.builder.expression.Expressions.subtract;
    
    import com.allanbank.mongodb.bson.element.ArrayElement;
    import com.allanbank.mongodb.builder.Aggregate;
    import com.allanbank.mongodb.builder.AggregationGeoNear;
    import com.allanbank.mongodb.builder.GeoJson;
    
    public class AggregateGeoNear {
        public static void main(String[] args) {
            Aggregate aggregate = Aggregate
                    .builder()
                    .geoNear(
                            AggregationGeoNear.builder()
                                    .location(GeoJson.p(10, 10))
                                    .distanceField("distance"))
                    .project(
                            include("name", "location", "maximumDistance"),
                            set("delta",
                                    subtract(field("maximumDistance"),
                                            field("distance"))))
                    .match(where("delta").greaterThanOrEqualTo(0)).build();
    
            System.out
                    .println(new ArrayElement("pipeline", aggregate.getPipeline()));
        }
    }
    

    そして、ここにパイプラインが作成されます:

    pipeline : [
      {
        '$geoNear' : {
          near : [
            10, 
            10
          ],
          distanceField : 'distance',
          spherical : false,
          uniqueDocs : true
        }
      }, 
      {
        '$project' : {
          name : 1,
          location : 1,
          maximumDistance : 1,
          delta : {
            '$subtract' : [
              '$maximumDistance', 
              '$distance'
            ]
          }
        }
      }, 
      {
        '$match' : {
          delta : { '$gte' : 0 }
        }
      }
    ]
    

    HTH-ロブ。

    P.S.上記のビルダーは、ドライバーの1.2.0バージョンのプレリリースを使用しています。コードは入力時にビルドマトリックスを通過しており、2013年3月22日金曜日までにリリースされる予定です。



    1. 各Meteorプロセスは何をしますか?

    2. Node.jsで機能しない外部モジュールのスキーマ

    3. MongoDBレプリケーションがクラッシュし、再起動しません

    4. MongoDBAggregate-グループ内の最新のアイテムを取得するためのクエリ