MongoDB 创建地图索引及根据位置坐标查询地点小例子

本文介绍MongoDB中地图索引的创建方法,并通过示例演示如何使用2D和2Dsphere索引来根据地理位置坐标查询附近的地点信息。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

MongoDB 创建地图索引及根据位置坐标查询地点小例子

1:MongoDB 的安装
参照博客:http://www.cnblogs.com/sweetchildomine/p/6397136.html
可视化工具:本人用的是robomongo ,下载地址:https://robomongo.org/
2:创建地图索引:
db.shop.ensureIndex( { loc : "2dsphere" } )
db.shop.ensureIndex( { loc : "2d" } ) 
1.2D索引,用于存储和查找平面上的点。
2.2Dsphere索引,用于存储和查找球面上的点。
3:spring-mongo的配置:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:mongo="http://www.springframework.org/schema/data/mongo"
       xsi:schemaLocation="http://www.springframework.org/schema/context
          http://www.springframework.org/schema/context/spring-context-4.3.xsd
          http://www.springframework.org/schema/data/mongo
          http://www.springframework.org/schema/data/mongo/spring-mongo-1.10.2.xsd
          http://www.springframework.org/schema/beans
          http://www.springframework.org/schema/beans/spring-beans-4.3.xsd">
    <context:component-scan base-package="com.binxm.dao"></context:component-scan>

    <!-- 加载mongodb的属性配置文件 -->
    <context:property-placeholder location="classpath:properties/mongodb.properties" />

    <!-- mongo对象 -->
    <mongo:mongo-client id="mongo" replica-set="${mongo.hostport}">
        <mongo:client-options connections-per-host="${mongo.connectionsPerHost}"
                              threads-allowed-to-block-for-connection-multiplier="${mongo.threadsAllowedToBlockForConnectionMultiplier}"
                              connect-timeout="${mongo.connectTimeout}"
                              max-wait-time="${mongo.maxWaitTime}"
                              socket-keep-alive="${mongo.socketKeepAlive}"
                              socket-timeout="${mongo.socketTimeout}" />
    </mongo:mongo-client>

    <mongo:db-factory dbname="database" mongo-ref="mongo" />

    <bean id="mongoTemplate" class="org.springframework.data.mongodb.core.MongoTemplate">
        <constructor-arg ref="mongo" />
        <constructor-arg name="databaseName" value="${mongo.databaseName}" />
    </bean>
</beans>
普通的增删改查操作
package com.binxm.dao.impl;

import com.binxm.dao.MoUserDao;
import com.binxm.pogo.MoUser;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.core.query.Criteria;
import org.springframework.data.mongodb.core.query.Query;
import org.springframework.stereotype.Repository;
/**
 * Created by Administrator on 2017/6/13.
 */
@Repository
public class MoUserDaoImpl implements MoUserDao{
    @Autowired
    private MongoTemplate mongoTemplate;
    @Override
    public MoUser getUserById(String id) {
        Query query = new Query();
        //查找
        //mongoTemplate.findOne(new Query(Criteria.where("onumber").is("002").and("cname").is("zcy1")),MoUser.class);
        //mongoTemplate.findOne(new Query(new Criteria().orOperator(Criteria.where("onumber").is("002"),Criteria.where("cname").is("zc"))),MoUser.class);
        //修改
        //mongoTemplate.upsert(new Query(Criteria.where("dfs").is("sss")), Update.update("",""),MoUser.class);
        //mongoTemplate.updateFirst(new Query(Criteria.where("dfs").is("sss")), Update.update("",""),MoUser.class);
        //添加
        mongoTemplate.insert(MoUser.class);
        mongoTemplate.save(MoUser.class);
        //删除
        //mongoTemplate.remove(MoUser.class);
        query.addCriteria(new Criteria("_id").is(id));
        MoUser one = this.mongoTemplate.findOne(query, MoUser.class);
        return one;
    }
}
根据位置坐标查询相关地点信息
package com.binxm.dao.impl;

import com.binxm.dao.ShopDao;
import com.mongodb.AggregationOptions;
import com.mongodb.BasicDBObject;
import com.mongodb.Cursor;
import com.mongodb.DBObject;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.stereotype.Repository;

import java.util.*;

/**
 * Created by li on 2017/9/24.
 */
@Repository
public class ShopDaoImpl implements ShopDao{
    @Autowired
    private MongoTemplate mongoTemplate;
    @Override
    public List<DBObject> getShoppingsWithCoordinate(double lon, double lat,double maxDistance) {
        List<DBObject> pipeLine = new ArrayList<>();
        //https://docs.mongodb.com/manual/reference/command/geoNear/
        BasicDBObject aggregate = new BasicDBObject("$geoNear",
                new BasicDBObject("near",new BasicDBObject("type","Point").append("coordinates",new double[]{lon, lat}))
                        .append("distanceField","dist.calculated")  //distanceField
                        // org.springframework.data.mongodb.core.aggregation.GeoNearOperation
                        .append("query", new BasicDBObject())  //query  document Optional
                        .append("num", 5)               //num number Optional
                        .append("maxDistance", maxDistance)  //num number Optional
                        .append("spherical",true)     //If using a 2dsphere index, spherical must be true.
        );
        pipeLine.add(aggregate);
//        聚合
//        https://docs.mongodb.com/manual/reference/operator/aggregation/
//        pipeLine.add(new BasicDBObject("$geoNear", geoNear));  BasicDBObject
//        pipeLine.add(new BasicDBObject("$match",match));
//        pipeLine.add(new BasicDBObject("$skip", skip));
//        pipeLine.add(new BasicDBObject("$limit", pageSize));
        Cursor cursor=mongoTemplate.getCollection("shop").aggregate(pipeLine, AggregationOptions.builder().build());
        List<DBObject> list = new LinkedList<>();
        while (cursor.hasNext()) {
            list.add(cursor.next());
        }
        return list;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值