MongoDB
 sql >> Cơ Sở Dữ Liệu >  >> NoSQL >> MongoDB

Truy vấn gần / địa lý MongoDb với khoảng cách thay đổi

Bạn sẽ không thể thực hiện việc này với một truy vấn thông thường vì bạn không thể đặt động khoảng cách cho mỗi tài liệu. Kể từ MongoDB 2.4, bạn có thể thực hiện việc này với khung tổng hợp vì họ đã thêm toán tử geoNear vào đầu các đường ống.

Giai đoạn đầu tiên sẽ là geoNear rất giống với lệnh geonear. Kết quả là chúng tôi cũng sẽ nhận được khoảng cách từ điểm được chỉ định (10,10) đến tài liệu.

Giai đoạn thứ hai, chúng tôi sẽ cần sử dụng toán tử dự án để quảng cáo sự khác biệt giữa trường MaximumDistance và khoảng cách địa lý được tính toán.

Cuối cùng, chúng tôi đối sánh những tài liệu có delta dương ((max - distance)> 0).

Đây là quy trình sử dụng Trình điều khiển Java không đồng bộ các lớp trợ giúp của.

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

Và đây là đường dẫn được tạo:

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. Các nhà xây dựng ở trên đang sử dụng bản phát hành trước của phiên bản 1.2.0 của trình điều khiển. Mã sẽ đi qua ma trận xây dựng khi tôi nhập và sẽ được phát hành trước Thứ Sáu, ngày 22 tháng 3 năm 2013.



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Làm cách nào để sắp xếp kết quả truy vấn MongoDB theo kích thước mảng bên trong?

  2. GeoNear trong MongoDB có thể trả về một tập hợp con các trường trong tài liệu không?

  3. Xóa phần tử mảng trong mongoDB dựa trên vị trí của phần tử

  4. Tạo đối tượng BSON từ chuỗi JSON

  5. Làm cách nào để sử dụng tính năng tổng hợp cho MongoDB để lọc dựa trên $ và / $ hoặc?