mongodb 创建LBS位置索引

Posted 书山有路勤为径,学海无涯苦作舟(肖建锋)

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了mongodb 创建LBS位置索引相关的知识,希望对你有一定的参考价值。

<dependency>
  <groupId>org.mongodb</groupId>
  <artifactId>mongo-java-driver</artifactId>
  <version>3.2.2</version>
</dependency>

<dependency>
  <groupId>org.apache.commons</groupId>
  <artifactId>commons-lang3</artifactId>
  <version>3.4</version>
</dependency>


package com.teewoo.mongodb;

import com.mongodb.BasicDBObject;
import com.mongodb.BasicDBObjectBuilder;
import com.mongodb.MongoClient;
import com.mongodb.ServerAddress;
import com.mongodb.client.FindIterable;
import com.mongodb.client.MongoCollection;
import com.mongodb.client.MongoCursor;
import com.mongodb.client.MongoDatabase;
import org.apache.commons.lang3.StringUtils;
import org.bson.Document;
import org.bson.types.ObjectId;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

/**
* mongoDB 基本操作
*
* @author xiaojf  2016-6-24 15:55:56
*/
public class MongoBaseOps {
    private static MongoClient client;      //mongo客户端
    static {
        client = new MongoClient(Arrays.asList(new ServerAddress("localhost", 27017)));
    }

    /**
    * 根据db名称获取db对象
    *
    * @param name db名称
    * @return db对象
    * @author xiaojf  2016-6-24 16:27:56
    */
    public static MongoDatabase getDbByName(String name) {
        MongoDatabase mongoDatabase = client.getDatabase(name);
        return mongoDatabase;
    }

    /**
    * 根据mongo db名称和mongo collection 名称获取mongo collection对象
    *
    * @param dbName mongo db名称
    * @param collectionName mongo collection 名称
    * @return mongo collection对象
    * @author xiaojf  2016-6-24 16:36:39
    */
    public static MongoCollection getCollectionByName(String dbName,String collectionName){
        MongoCollection<Document> mongoCollection = getDbByName(dbName).getCollection(collectionName);

        return mongoCollection;
    }

    /**
    * 新增文档
    *
    * @param dbName mongo db 名称
    * @param collectionName mongo collection 名称
    * @param document 文档
    * @author xiaojf  2016-6-24 16:36:39
    */
    public static void insertDoc(String dbName,String collectionName,Document document){
        MongoCollection mongoCollection = getCollectionByName(dbName, collectionName);

        mongoCollection.insertOne(document);
    }

    /**
    * 批量新增文档
    *
    * @param dbName mongo db 名称
    * @param collectionName mongo collection 名称
    * @param documents 文档集合
    * @author xiaojf  2016-6-24 16:36:39
    */
    public static void batchInsertDoc(String dbName, String collectionName, List documents){
        MongoCollection mongoCollection = getCollectionByName(dbName, collectionName);

        mongoCollection.insertMany(documents);
    }

    /**
    * 根据id删除文档
    *
    * @param dbName mongo db 名称
    * @param collectionName mongo collection 名称
    * @param id mongo document _id
    * @author xiaojf  2016-6-24 17:07:16
    */
    public static void deleteById(String dbName, String collectionName,String id){
        if (StringUtils.isBlank(dbName) || StringUtils.isBlank(collectionName) || StringUtils.isBlank(id)) {
            return ;
        }
        MongoCollection mongoCollection = getCollectionByName(dbName, collectionName);
        mongoCollection.deleteOne(new BasicDBObject("_id", new ObjectId(id)));
    }

    /**
    * 根据id获取文档
    *
    * @param dbName mongo db 名称
    * @param collectionName mongo collection 名称
    * @param id mongo document _id
    * @author xiaojf  2016-6-24 17:07:16
    */
    public static Object getById(String dbName, String collectionName,String id){
        if (StringUtils.isBlank(dbName) || StringUtils.isBlank(collectionName) || StringUtils.isBlank(id)) {
            return null;
        }

        MongoCollection mongoCollection = getCollectionByName(dbName, collectionName);
        FindIterable findIterable = mongoCollection.find(new BasicDBObject("_id", new ObjectId(id)));
        MongoCursor cursor = findIterable.iterator();

        while (cursor.hasNext()) {
            return cursor.next();
        }

        return null;
    }

    /**
    * 创建索引
    *
    * @param dbName mongo db 名称
    * @param collectionName mongo collection 名称
    * @param fieldName 字段名称
    * @param indexType 索引类型
    * @author xiaojf  2016-6-27 13:43:02
    */
    public static void createIndex(String dbName, String collectionName,String fieldName,String indexType){
        MongoCollection mongoCollection = getCollectionByName(dbName, collectionName);
        mongoCollection.createIndex(new BasicDBObject(fieldName, indexType));
    }

    public static void main(String[] args) {
        //获取 mongodb db对象
        MongoDatabase mongoDatabase = MongoBaseOps.getDbByName("db_test");
        //删除旧mongodb collection
        mongoDatabase.getCollection("collect_gps").drop();

        List<Document> documentList = new ArrayList<Document>();
        for (int i = 0 ;i<100;i++) {
            //构建2d索引的LBS document
            Document doc = new Document();
            doc.put("gps", BasicDBObjectBuilder.start().add("lon", 33+i).add("lat", i-33).get());
            documentList.add(doc);
        }
        //批量新增文档给
        MongoBaseOps.batchInsertDoc("db_test","collect_gps",documentList);
        //创建2d索引
        MongoBaseOps.createIndex("db_test","collect_gps","gps","2d");
    }
}

 

以上是关于mongodb 创建LBS位置索引的主要内容,如果未能解决你的问题,请参考以下文章

图解 MongoDB 地理位置索引的实现原理

详解MongoDB索引优化

Mysql空间索引

SpringMVC

MongoDB索引

云MongoDB 优化让LBS服务性能提升十倍