mogoTemplate 模板 实现mongodb java的操作 ,根据经纬度查询周边

来源:互联网 发布:hadoop云计算实战 编辑:程序博客网 时间:2024/05/21 09:29
主要是索引啊,实现这个由于网上找不到相关资料。只能自己一步步测试出来。   

前提条件:
建立空间索引的key可以使用array或内嵌文档存储,但是前两个elements必须存储固定的一对空间位置数值。如
{ loc : [ 50 , 30 ] }
{ loc : { x : 50 , y : 30 } }
{ loc : { foo : 50 , y : 30 } }
{ loc : { lat : 40.739037, long: 73.992964 } }



下边是我的数据格式      由于原来左边在另一个实体里边,我把它提取到外边,个人觉得方便写查询语句 。。。同时可以用于创建2d索引 ,否则原来的数据格式无法创建2d索引。
{
  "_class" : "com.mongodb.BasicDBObject",
  "hotelDataEntity" : {
    "hotelInfo" : {
          "lon" : 116.25390564321,
          "fax" : "0",
          "cityID" : 1,
          "lat" : 40.074496992216,
          "minPrice" : 43
        }
  },
  "id" : "1288173",
  "coordinates" : [116.25390564321, 40.074496992216]
}


    /**
     * @Title: testsuoyin
     * @Description: 添加2d索引    ,注意2d索引需要特定条件   
     * @param 设定文件
     * @return void 返回类型
     * @throws
     */
    @Test
    public void testsuoyin() {
        Mongo mongo;
        try {
            mongo = new Mongo("**************", 27017);
            // 连接名为yourdb的数据库,假如数据库不存在的话,mongodb会自动建立
            DB db = mongo.getDB("yourdb");
            // Get collection from MongoDB, database named "yourDB"
            //
            // 从Mongodb中获得名为yourColleection的数据集合,如果该数据集合不存在,Mongodb会为其新建立
            DBCollection collection = db.getCollection("hotel");

            BasicDBObject dObject1 = new BasicDBObject();
            dObject1.put("coordinates", "2d");//2d  -----2dsphere   区别在下边
            collection.ensureIndex(dObject1);

        } catch (UnknownHostException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

    }




2d 和2dsphere   区别,我个人测试觉得他的区别  2d填写的是    搜索的时候入参是经纬度  ,2dsphere   可以直接填距离  也就是多少m





下边是查询方法
    public List<HotelDataEntity> findLonAndLat() {
        List<Map> dBCursor = new ArrayList<Map>();
        MongoTemplate mogoTemplate = null;
        try {
            mogoTemplate = getmongo();
            Query searchQuery= new Query();
            Circle cri = new Circle(116.35205435254, 39.91133015557, 5000.00);
            searchQuery.addCriteria(Criteria.where("coordinates").within(cri));  
//模板类提供了很多方式 ,可以直接添加  以一个圆的方式搜索周边。方圆多大就定义一个多大的圆    ,这里第一个参数为  纬度 //,第二个参数为经度  。。。第三个参数可以说是圆半径。。
            searchQuery.limit(10); //我是分页哦
            List<Map> myDoc = mogoTemplate.find(searchQuery, Map.class,
                    HOTRLURL);

        } catch (Exception e) {
            e.printStackTrace();
        }
        return hotelDataEntityList;

    }

-------------------------------------so以上基本上完成了搜索 ----------------------------------------------




还有种搜索是2dsphere    的索引 ,








0 0
原创粉丝点击