`

mongodb计算地理空间距离实例

阅读更多
需求:有很多条件,其中包括根据附近多少米查找信息,这个需要先定位当前人所在的位置(即经纬度),然后在进行这个经纬度的附近进行查找信息,因为之前根据经纬度算地理空间位置是在mysql中进行的,但是发现在mysql中计算很耗CPU,现特改成mongodb来做,mongodb不支持union all功能,所以mongodb还是不满足
               	//判断是否按距离排序
			if(seq == 1 || seq == 0 || seq == 4){
				//默认排序统一采用综合排序
				if(seq == 0){
					seq = 4;
				}
				if(lon != 0 && lat != 0){
				}else{
					seq=2;
				}
			}
			DBObject sortFileds = new BasicDBObject();
			DBObject geoNearFileds = new BasicDBObject();
			geoNearFileds.put("distanceMultiplier", r);
			geoNearFileds.put("near",  new double[]{lon,lat});
			geoNearFileds.put("spherical",true);
			geoNearFileds.put("distanceField", "distance");
			geoNearFileds.put("includeLocs", "position");
			geoNearFileds.put("query", criteria.getCriteriaObject());
			if (nearby!=0) {//选择了附近
				geoNearFileds.put("maxDistance", nearby);
				if (seq==0||seq==4) {
					sortFileds.put("seqScore", -1);
					sortFileds.put("evalGoodCount", -1);
					sortFileds.put("distance", 1);
					if (nearby == 0) {
						sortFileds.put("seqRating", 1);
					}
					sortFileds.put("carNo", 1);
				}
				sortFileds = sort(seq, sortFileds);
			}else{//未选择附近
				if (seq==0||seq==4) {
					sortFileds.put("seqRating", -1);
					sortFileds.put("carNo", 1);
					sortFileds.put("distance", 1);
				}else {
					sortFileds = sort(seq, sortFileds);
				}
			} 

			DBObject geoNear = new BasicDBObject("$geoNear", geoNearFileds);

			DBObject sort = new BasicDBObject("$sort", sortFileds);

			//DBObject match  = new BasicDBObject("$match", criteria.getCriteriaObject());

			DBObject skip  = new BasicDBObject("$skip",(pageNum-1)*pageSize);

			DBObject limit  = new BasicDBObject("$limit",pageSize);

			List<DBObject> dbObjects =  super.aggregate(CarInfo.class, geoNear/*,match*/,skip,limit,sort);

			List<CarInfo> carInfos = new ArrayList<CarInfo>();

			if (CollectionUtils.isEmpty(dbObjects)) {
				return null;
			}
			for (DBObject dbObject : dbObjects) {
				CarInfo carInfo = new CarInfo();
				carInfo = MongoUtils.dbObject2Bean(dbObject, carInfo);
				carInfo.setId(dbObject.get("_id").toString());
				if (tag==1) {
					carInfo.setCoverPic("1"+carInfo.getCoverPic());
				}else {
					carInfo.setCoverPic("2"+carInfo.getCoverPic());
				}
				carInfo.setEvalCount((Integer.valueOf(dbObject.get("evalGoodCount")+"")+Integer.valueOf(dbObject.get("evalMediumCount")+"")+Integer.valueOf(dbObject.get("evalBadCount")+""))+"");
				carInfos.add(carInfo);
			}

这段代码之前使用aggregate $match来进行根据条件查询,发现查询的结果跟实际结果差距很大,至今不知道为何,现改成geoNear的query匹配条件进行查询,结果正确
分享到:
评论

相关推荐

    MongoDB详解加实例

    你可以使用`db.collection.createIndex()`创建索引,可以选择单字段、复合字段或者地理空间索引。索引可以按照升序或降序排列,也可以设置唯一性,防止重复数据。 五、MongoDB与PHP集成 MongoDB提供了PHP驱动程序,...

    巧妙的利用Mongodb做地理空间查询

    本文将深入探讨如何利用MongoDB进行地理空间查询,这对于开发涉及地理位置服务的移动应用、物联网项目以及智慧城市应用至关重要。 在MongoDB中,地理位置索引允许我们对地址数据进行高效检索。它提供了多种类型,如...

    spring mongodb 用法总结和实例

    在Spring框架中,Spring Data MongoDB是一个强大的库,它简化了与MongoDB数据库的交互。这个库允许开发者通过使用注解和基于Java的配置来处理MongoDB的操作。以下是对标题和描述中提到的知识点的详细说明: 1. **@...

    Java操作MongoDB实例

    Java操作MongoDB实例,压缩包内为完整项目源码,使用MyEclipse软件 见文:https://blog.csdn.net/qq_33427869/article/details/87270444

    MongoDB实例

    在本MongoDB实例中,我们将深入探讨这个强大的NoSQL数据库系统,并与C#、MVC和asp.net进行集成。 首先,MongoDB的核心概念是集合(Collections)和文档(Documents)。集合类似于关系数据库中的表,但文档则是基于...

    mongodb 复制集搭建实例

    MongoDB复制集搭建实例 MongoDB是一个高性能、开源、无模式的文档型数据库,它以其灵活性、可扩展性和丰富的功能而被广泛应用于大数据处理、Web应用、内容管理系统等多个领域。复制集是MongoDB中的一个重要特性,它...

    SpringMVC+mongodb应用实例

    在本实践教程中,我们将深入探讨如何将SpringMVC框架与MongoDB数据库结合,构建一个高效的应用实例。MongoDB是一个流行的NoSQL数据库,以其灵活性、高性能和易扩展性而受到开发者的青睐。SpringMVC是Spring框架的一...

    mongodb多实例副本集群详细搭建

    ### MongoDB多实例副本集群搭建详解 #### 一、概述 MongoDB是一种非常流行的NoSQL数据库系统,它提供了高性能、高可用性和易于扩展性等特点。在实际应用中,为了提高系统的可靠性和性能,我们通常会搭建MongoDB的...

    mongodb随机获取一条记录实例

    MongoDB是一种分布式文档数据库,常用于处理和存储结构化与半结构化的数据。它使用JSON-like的BSON格式存储数据,...在实际开发中,还可以利用更多高级特性,如聚合框架、地理空间查询、索引等,以满足复杂的应用场景。

    mongodb基本命令和实例

    以下是从给定的标题、描述和标签中提取的MongoDB基本命令和实例的详细说明: 1. **显示数据库**: `show dbs` 命令用来列出当前MongoDB服务器上已存在的所有数据库,以及它们占用的空间大小。 2. **切换数据库**...

    mongodb中文API及分布式分片实例详解

    二、MongoDB分布式分片实例详解 1. 分片概念:分片是将大数据集分散到多个物理节点上的过程,以提高读写性能和存储容量。MongoDB通过分片实现水平扩展。 2. 设置分片集群:首先,需要启动配置服务器、分片服务器和...

    c#操作mongodb实例(含完整源码)

    总的来说,这个实例为C#开发者提供了一个全面了解如何使用MongoDB的起点,涵盖了MongoDB数据操作的基础,对于学习和实践中使用MongoDB与C#的结合非常有帮助。通过深入研究并理解这些源码,开发者可以更好地掌握...

    Mongodb地理信息查询案例数据集

    mongodb官网给出了一个地理信息查询案例,通过介绍一个基于地图的酒店查询系统,展示了mongodb对地理信息查询的支持。但因为网络原因,导致该数据集无法下载。因此下载下来供各位研究学习使用。 原资源链接: ...

    MongoDB Java操作大全 源代码 实例

    本资料包“MongoDB Java操作大全 源代码 实例”将深入探讨如何使用Java API进行MongoDB的操作。 1. **连接MongoDB** 在Java中,首先需要通过`MongoClient`类建立到MongoDB服务器的连接。例如: ```java ...

    行业分类-设备装置-以GeoJSON格式结构化方式存储地理数据的MongoDB集群的地理数据读写方法.zip

    5. **数据读写实践**:资料可能包含如何使用MongoDB的CRUD操作(Create、Read、Update、Delete)来插入、查询、更新和删除GeoJSON地理数据的实例,以及如何在MongoDB shell、MongoDB驱动程序或应用程序代码中实现...

    mongodb的小例子

    在Python中,你可以通过`pymongo.MongoClient()`创建一个客户端实例,然后指定服务器地址和端口来连接到MongoDB实例。 3. **数据库操作**:MongoDB中的数据库类似于其他数据库系统中的模式。你可以使用`client.list...

    Log4j+MongoDB 完整实例

    在这个"Log4j+MongoDB完整实例"中,我们将探讨如何利用Log4j收集应用程序日志,并将这些日志有效地存储到MongoDB中进行分析。 首先,Log4j的核心在于其灵活的配置。通过XML或.properties文件,我们可以定制日志级别...

    php结合mongodb判断坐标是否在指定多边形区域内的实例

    MongoDB是一款强大的NoSQL数据库,支持丰富的地理空间索引,使得处理地理位置数据变得简单高效。而PHP作为一种常用的服务器端脚本语言,是实现这一功能的理想选择。 首先,让我们了解MongoDB中的地理空间索引。...

    java操作mongodb存储文件实例

    将一系列图片文件存储到MongoDB中 java操作mongodb存储文件

    MongoDB开发应用实例

    Mongodb的使用语法以及同传统sql语句的对比

Global site tag (gtag.js) - Google Analytics