MongoDB
 sql >> Teknologi Basis Data >  >> NoSQL >> MongoDB

Permintaan MongoDb dekat/geonear dengan jarak variabel

Anda tidak akan dapat melakukan ini dengan kueri normal karena Anda tidak dapat mengatur jarak per dokumen secara dinamis. Mulai MongoDB 2.4 Anda dapat melakukannya dengan kerangka kerja agregasi karena mereka telah menambahkan operator geoNear ke awal pipeline.

Tahap pertama adalah geoNear yang sangat mirip dengan perintah geonear. Kami juga akan mendapatkan jarak dari titik yang ditentukan (10,10) ke dokumen sebagai hasilnya.

Tahap kedua kita perlu menggunakan operator proyek untuk mengiklankan perbedaan antara bidang maximumDistance dan jarak geoNear yang dihitung.

Terakhir, kami mencocokkan dokumen yang memiliki delta positif ((maks - jarak)> 0).

Berikut adalah alur menggunakan Driver Java Asinkron kelas pembantu.

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()));
    }
}

Dan inilah pipeline yang dibuat:

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 - Rob.

P.S. Pembangun di atas menggunakan pra-rilis driver versi 1.2.0. Kode akan melalui matriks build saat saya mengetik dan akan dirilis paling lambat Jumat, 22 Maret 2013.



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. mencari database dengan api luwak dan nodejs?

  2. Bagaimana cara memperbarui bidang dokumen di mongo db menggunakan driver java?

  3. Cara membuat skema luwak dari JSON

  4. `bidang tidak boleh sama:' ' dan ' ` kesalahan mongoimport

  5. Konsistensi baca-Anda-tulis-tulis di Mongodb