`

Mongodb 原生操作类

 
阅读更多
import com.mongodb.MongoClient;
import com.mongodb.client.FindIterable;
import com.mongodb.client.MongoCollection;
import com.mongodb.client.MongoDatabase;
import com.mongodb.client.model.Filters;
import com.mongodb.client.model.UpdateManyModel;
import com.mongodb.client.model.geojson.Point;
import com.mongodb.client.model.geojson.Polygon;
import com.mongodb.client.model.geojson.Position;
import org.apache.commons.collections.CollectionUtils;
import org.apache.commons.lang3.StringUtils;
import org.bson.Document;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;

/**
 * 原生java操作MongoDB工具类
 *
 * @author: lanweixing
 * @create: 2019-05-15 14:06
 **/
@Component
public class MongodbManageHandler {

    private final static Logger logger = LoggerFactory.getLogger(MongodbManageHandler.class);

    @Value("${r.mongo.dbname}")
    private String dbName ;

    @Autowired
    private MongoClient mongodbClient;

    /**
     * 获取Mongodb集合
     *
     * @param collectionName
     * @return
     */
    public MongoCollection doGetMongoCollection(String collectionName){
        MongoDatabase database = this.mongodbClient.getDatabase(this.dbName);
        if(database != null){
            return database.getCollection(collectionName);
        }
        return null ;
    }

    /**
     * 通过经纬度获取区域ID
     * 一个经纬度只能在一个区域内
     *
     *
     * @param lng
     * @param lat
     * @return
     */
    public List<Long> doGetAreaIdByLngAndLat(Double lng, Double lat){
        Preconditions.checkNotNull(lng,"经度不能为空");
        Preconditions.checkNotNull(lat,"纬度不能为空");
        Preconditions.checkState(lng != 0,"经度不能为0");
        Preconditions.checkState(lat != 0,"纬度不能为0");
        Stopwatch stopwatch = Stopwatch.createStarted();
        List<Long> areaIds = Lists.newArrayList();
        try{
            MongoCollection mongoCollection = this.doGetMongoCollection("cityServiceArea");
            if(mongoCollection != null){
                FindIterable findIterable = mongoCollection.find(Filters.geoIntersects("geo",new Point(new Position(lng,lat))));
                if(findIterable != null){
                    Document document = (Document)findIterable.first();
                    if(document != null){
                        areaIds.add((long)document.get("_id"));
                    }
                }
            }
            logger.info("【SBS】通过经纬度获取区域值ID:{} 耗时:{}", JSON.toJSONString(areaIds),stopwatch.stop());
            return areaIds;
        }catch (Exception e){
            logger.info("【SBS】通过经纬度获取区域ID出错,{}",e);
            throw new BusinessException(ErrorCodeConstants.BUSINESS_ERROR, "通过经纬度获取区域异常");
        }
    }

    /**
     * 批量插入区域信息
     *
      * @param cityServiceAreas
     */
    public void doBatchInsertCityServiceArea(List<CityServiceArea> cityServiceAreas){
        Stopwatch stopwatch = Stopwatch.createStarted();
        if(CollectionUtils.isNotEmpty(cityServiceAreas)){
            MongoCollection mongoCollection = this.doGetMongoCollection("cityServiceArea");
            if(mongoCollection != null){
                try {
                    List<Document> saveCollections = Lists.newArrayList();
                    for(CityServiceArea cityServiceArea : cityServiceAreas){
                        if(cityServiceArea != null){
                            Document document = new Document();
                            document.append("_id", cityServiceArea.getId());
                            document.append("_class","com.hk.sbs.mongodb.CityServiceAreaMongo");
                            if(StringUtils.isNotEmpty(cityServiceArea.getServiceArea())){
                                document.append("geo",new Polygon(Arrays.stream(cityServiceArea.getServiceArea().split("@")).map(lonLats -> lonLats.split(",")).map(lonLat -> new Position(Double.parseDouble(lonLat[0]), Double.parseDouble(lonLat[1]))).collect(Collectors.toList())));
                            }
                            document.append("cityCode",cityServiceArea.getCityCode());
                            document.append("cityName",cityServiceArea.getCityName());
                            saveCollections.add(document);
                        }
                    }
                    mongoCollection.insertMany(saveCollections);
                    logger.info("【SBS】批量保存区域数据耗时:{}",stopwatch.stop());
                } catch (Exception e) {
                    logger.info("【SBS】批量保存区域数据异常,{}",e);
                    throw new BusinessException(ErrorCodeConstants.BUSINESS_ERROR, "批量保存区域数据异常");
                }
            }
        }
    }

    /**
     * 批量更新区域信息
     *
     * @param cityServiceAreas
     */
    public void doBatchUpdateCityServiceArea(List<CityServiceArea> cityServiceAreas){
        Stopwatch stopwatch = Stopwatch.createStarted();
        if(CollectionUtils.isNotEmpty(cityServiceAreas)){
            MongoCollection mongoCollection = this.doGetMongoCollection("cityServiceArea");
            if(mongoCollection != null){
                try {
                    List<UpdateManyModel<Document>> updateCollections = Lists.newArrayList();
                    for(CityServiceArea cityServiceArea : cityServiceAreas){
                        if(cityServiceArea != null){
                            Document queryDocument = new Document("_id", cityServiceArea.getId());
                            Document setDocument = new Document()
                            .append("_class","com.hk.sbs.mongodb.CityServiceAreaMongo");
                            if(StringUtils.isNotEmpty(cityServiceArea.getServiceArea())){
                                setDocument.append("geo",new Polygon(Arrays.stream(cityServiceArea.getServiceArea().split("@")).map(lonLats -> lonLats.split(",")).map(lonLat -> new Position(Double.parseDouble(lonLat[0]), Double.parseDouble(lonLat[1]))).collect(Collectors.toList())));
                            }
                            setDocument.append("cityCode",cityServiceArea.getCityCode());
                            setDocument.append("cityName",cityServiceArea.getCityName());
                            updateCollections.add(new UpdateManyModel<Document>(queryDocument,new Document("$set",setDocument)));
                        }
                    }
                    mongoCollection.bulkWrite(updateCollections);
                    logger.info("【SBS】批量更新区域数据耗时:{}",stopwatch.stop());
                } catch (Exception e) {
                    logger.info("【SBS】批量更新区域数据异常,{}",e);
                    throw new BusinessException(ErrorCodeConstants.BUSINESS_ERROR, "批量更新区域数据异常");
                }
            }
        }
    }
}



分享到:
评论

相关推荐

    php实现的mongodb操作类

    《PHP实现的MongoDB操作类详解》 MongoDB是一种基于分布式文件存储的开源数据库系统,以其灵活的数据模型、高性能和高可用性在现代Web开发中备受青睐。在PHP环境中,我们可以利用MongoDB的PHP驱动来操作MongoDB。...

    tp6+mongodb.zip

    对于复杂的BSON对象,可以使用MongoDB PHP库的`Document`类进行操作。 在性能优化方面,理解MongoDB的索引机制至关重要。正确地创建和使用索引可以显著提高查询速度。此外,避免在查询中使用`$where`操作符,因为它...

    Java连接mongoDB需要的jar包(3.9.1)

    这些JAR文件是MongoDB Java驱动程序的一部分,允许Java应用程序通过Java Database Connectivity (JDBC)或者原生的MongoDB驱动API来操作MongoDB数据库。 1. `bson-3.9.1.jar`: BSON(Binary JSON)是MongoDB用于存储...

    odbc-mongodb-1_0_14-windows

    "odbc-mongodb-1_0_14-windows" 是连接Windows应用和MongoDB数据库的重要工具,它使得不具备MongoDB原生API支持的应用也能方便地访问MongoDB数据,提升了开发和数据分析的灵活性。通过使用这个驱动程序,用户可以...

    mongodb.dll 关于C#的驱动连接mongodb数据库

    3. **MongoDatabase**:这个类代表MongoDB中的一个数据库,通过MongoClient可以获取到MongoDatabase实例,然后就可以对数据库进行增删改查等操作。 4. **MongoCollection**:MongoCollection代表数据库中的一个集合...

    Morphia 操作 MongoDB.pdf

    MongoDB 是一个流行的开源文档数据库系统,以其灵活性和高性能而...通过封装 MongoDB 的原生 API,Morphia 提供了一种类型安全且易于理解的方式来管理数据。这对于开发人员来说,大大降低了学习曲线,提高了开发效率。

    mongodb的java驱动jar包3.7.0

    这些类使得开发者能够执行CRUD(创建、读取、更新和删除)操作,以及查询、聚合等高级数据库操作。此外,这个JAR还支持异步操作,通过`MongoAsyncClient`和`MongoAsyncDatabase`,使高性能应用的实现成为可能。 ...

    Laravel开发-mongodb-lite

    Laravel MongoDB Eloquent扩展了原生的查询构造器,使其支持MongoDB特有的查询操作,如 `$elemMatch`, `$exists`, `$regex`等。 **注意事项** - MongoDB不支持事务,因此在处理需要事务的业务逻辑时需要特别注意。...

    spring mongodb很好的例子

    它提供了模板类和Repository接口,使得开发者可以通过Java代码而非原生的MongoDB驱动来操作数据库。例如,通过定义Repository接口,Spring Data会自动生成对应的CRUD操作,大大减少了编码工作量。 **MongoDB** ...

    MongoDb ORM 框架(构建类似 sql 的体验,体验风格与 wood 类似)

    在实际开发中,使用MongoDB ORM框架可以显著提升开发效率,因为它减少了对MongoDB原生驱动的学习成本,同时提供了更强大的类型安全和代码可维护性。然而,需要注意的是,虽然ORM能够简化很多工作,但在某些高级或...

    java-mongodb底层封装

    本项目针对MongoDB进行了底层封装,旨在提供一套简洁、高效的API,使得开发人员可以更加便捷地进行数据的增删查改操作,无需直接与MongoDB的原生驱动打交道。以下是关于"java-mongodb底层封装"这一主题的详细知识点...

    PHP操作Mongodb封装类完整实例

    本文实例讲述了PHP操作Mongodb封装类。分享给大家供大家参考,具体如下: &lt;?php /** * Mongodb 基本操作API,支持基本类似关系统型数据库的操作接口 * * @version 1.0 * [说明] * * 1:该版本API实现了 ...

    php实现的mongodb操作类实例

    总的来说,这个 PHP 实现的 MongoDB 操作类提供了一种结构化的方式来处理 MongoDB 数据库,使得开发者可以通过类的方法轻松地执行常见的数据库操作,而无需直接编写 MongoDB 的原生命令。这种方法提高了代码的可读性...

    java 连接 MongoDB 工具类示例

    Java连接MongoDB工具类示例主要展示了如何在...通过上述知识点,你可以创建一个实用的Java工具类,用于连接MongoDB数据库并执行常见的CRUD操作。这将极大地简化你的开发流程,使你能够更好地利用MongoDB的强大功能。

    mongodb安装文档和工具类.zip

    这个文件可能实现了这样的功能,使得可以使用SQL语句来操作MongoDB,虽然这并不是MongoDB的原生方式,但在某些场景下能提供更熟悉的数据库操作体验。 学习和理解这些Java工具类,有助于开发者熟练地在Java应用中...

    nodejs 操作mongodb,插查删改

    在Node.js中,我们通常会使用Mongoose或MongoDB原生驱动来连接和操作MongoDB。描述提到的是一个基于Node.js的类文件,可能是封装了这些数据库操作的工具类,但没有经过大规模并发测试,只在本地环境中进行了验证。这...

    mongodb&spring&struts&springdatamongodb整合,带所有jar,需要的拿走

    Spring Data MongoDB是Spring Data项目的一部分,它为MongoDB提供了简单易用的API,开发者可以避免直接编写MongoDB的原生驱动代码。Spring Data MongoDB支持自动实体映射,通过注解即可定义对象与MongoDB集合之间的...

    spring 整合mongodb

    Spring Data MongoDB允许开发者通过Java方法定义来执行MongoDB的查询,减少了对原生MongoDB查询语法的依赖。 1. **配置MongoDB连接**: 在整合Spring与MongoDB时,我们首先需要在`application.properties`或`...

    基于SpringBoot和MongoDB的留言板项目源码.zip

    它简化了数据访问,允许开发者使用Java方法定义查询,而无需编写原生的MongoDB查询语句。 6. **RESTful API**: 该项目很可能设计成RESTful风格的Web服务,通过HTTP协议提供CRUD(创建、读取、更新、删除)操作。这...

Global site tag (gtag.js) - Google Analytics