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操作类详解》 MongoDB是一种基于分布式文件存储的开源数据库系统,以其灵活的数据模型、高性能和高可用性在现代Web开发中备受青睐。在PHP环境中,我们可以利用MongoDB的PHP驱动来操作MongoDB。...
对于复杂的BSON对象,可以使用MongoDB PHP库的`Document`类进行操作。 在性能优化方面,理解MongoDB的索引机制至关重要。正确地创建和使用索引可以显著提高查询速度。此外,避免在查询中使用`$where`操作符,因为它...
这些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" 是连接Windows应用和MongoDB数据库的重要工具,它使得不具备MongoDB原生API支持的应用也能方便地访问MongoDB数据,提升了开发和数据分析的灵活性。通过使用这个驱动程序,用户可以...
3. **MongoDatabase**:这个类代表MongoDB中的一个数据库,通过MongoClient可以获取到MongoDatabase实例,然后就可以对数据库进行增删改查等操作。 4. **MongoCollection**:MongoCollection代表数据库中的一个集合...
MongoDB 是一个流行的开源文档数据库系统,以其灵活性和高性能而...通过封装 MongoDB 的原生 API,Morphia 提供了一种类型安全且易于理解的方式来管理数据。这对于开发人员来说,大大降低了学习曲线,提高了开发效率。
这些类使得开发者能够执行CRUD(创建、读取、更新和删除)操作,以及查询、聚合等高级数据库操作。此外,这个JAR还支持异步操作,通过`MongoAsyncClient`和`MongoAsyncDatabase`,使高性能应用的实现成为可能。 ...
Laravel MongoDB Eloquent扩展了原生的查询构造器,使其支持MongoDB特有的查询操作,如 `$elemMatch`, `$exists`, `$regex`等。 **注意事项** - MongoDB不支持事务,因此在处理需要事务的业务逻辑时需要特别注意。...
它提供了模板类和Repository接口,使得开发者可以通过Java代码而非原生的MongoDB驱动来操作数据库。例如,通过定义Repository接口,Spring Data会自动生成对应的CRUD操作,大大减少了编码工作量。 **MongoDB** ...
在实际开发中,使用MongoDB ORM框架可以显著提升开发效率,因为它减少了对MongoDB原生驱动的学习成本,同时提供了更强大的类型安全和代码可维护性。然而,需要注意的是,虽然ORM能够简化很多工作,但在某些高级或...
本项目针对MongoDB进行了底层封装,旨在提供一套简洁、高效的API,使得开发人员可以更加便捷地进行数据的增删查改操作,无需直接与MongoDB的原生驱动打交道。以下是关于"java-mongodb底层封装"这一主题的详细知识点...
本文实例讲述了PHP操作Mongodb封装类。分享给大家供大家参考,具体如下: <?php /** * Mongodb 基本操作API,支持基本类似关系统型数据库的操作接口 * * @version 1.0 * [说明] * * 1:该版本API实现了 ...
总的来说,这个 PHP 实现的 MongoDB 操作类提供了一种结构化的方式来处理 MongoDB 数据库,使得开发者可以通过类的方法轻松地执行常见的数据库操作,而无需直接编写 MongoDB 的原生命令。这种方法提高了代码的可读性...
Java连接MongoDB工具类示例主要展示了如何在...通过上述知识点,你可以创建一个实用的Java工具类,用于连接MongoDB数据库并执行常见的CRUD操作。这将极大地简化你的开发流程,使你能够更好地利用MongoDB的强大功能。
这个文件可能实现了这样的功能,使得可以使用SQL语句来操作MongoDB,虽然这并不是MongoDB的原生方式,但在某些场景下能提供更熟悉的数据库操作体验。 学习和理解这些Java工具类,有助于开发者熟练地在Java应用中...
在Node.js中,我们通常会使用Mongoose或MongoDB原生驱动来连接和操作MongoDB。描述提到的是一个基于Node.js的类文件,可能是封装了这些数据库操作的工具类,但没有经过大规模并发测试,只在本地环境中进行了验证。这...
Spring Data MongoDB是Spring Data项目的一部分,它为MongoDB提供了简单易用的API,开发者可以避免直接编写MongoDB的原生驱动代码。Spring Data MongoDB支持自动实体映射,通过注解即可定义对象与MongoDB集合之间的...
Spring Data MongoDB允许开发者通过Java方法定义来执行MongoDB的查询,减少了对原生MongoDB查询语法的依赖。 1. **配置MongoDB连接**: 在整合Spring与MongoDB时,我们首先需要在`application.properties`或`...
它简化了数据访问,允许开发者使用Java方法定义查询,而无需编写原生的MongoDB查询语句。 6. **RESTful API**: 该项目很可能设计成RESTful风格的Web服务,通过HTTP协议提供CRUD(创建、读取、更新、删除)操作。这...