我有以下数据库:
db.ItemVo.find()
{“_ id”:ObjectId(“55bf2b465ef98ff39dba049c”),“loc”:{“type”: “点”,“坐标”:[ - 4.427237,36.733284]},“标题”: “item1”,“summary”:“摘要item1”,“itemType”:“TXT”} {“_ id”: ObjectId(“55bf2ddc5ef98ff39dba049d”),“loc”:{“type”:“Point”, “coordinates”:[ - 3.427237,35.733284]},“title”:“item2”, “summary”:“Summary item2”,“itemType”:“TXT”}
通过$ near:
查找db.ItemVo.find({loc:{“$ near”:{“$ geometry”:{type:“Point”, 坐标:[ - 4.427,36.73]},“$ maxDistance”:20000}}})
{“_ id”:ObjectId(“55bf2b465ef98ff39dba049c”),“loc”:{“type”: “点”,“坐标”:[ - 4.427237,36.733284]},“标题”: “item1”,“summary”:“Summary item1”,“itemType”:“TXT”}
Morphia DAO:
public List<ItemVo> findByNear (){
LOGGER.info("[ItemDAO - findByNear] - init");
List<ItemVo> str = getDs().find(ItemVo.class).field("loc").near(-4.427, 36.73, 2000/111.12, true).asList();
return str;
}
Morphia返回集合的所有元素,而不是$ near附近。 Morphia应该只返回元素“item1”而不是“item2”。问题在哪里?
我的对象:
@Entity
@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
Public class ItemVo implements Serializable{
private static final long serialVersionUID = 1258690003100456384L;
@Id private String id;
@Embedded
private LocationVo loc;
private String title;
private String summary;
........
@Embedded
@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
public class LocationVo implements Serializable{
private static final long serialVersionUID = -5282690346503247312L;
private String type; //POINT, etc
private double[] coordinates;
谢谢你。
答案 0 :(得分:1)
行。我跟踪了它,这很简单。出于逃避我的原因,mongo shell采用lat / long坐标,morphia采用long / lat。因此,虽然看起来就像你在morphia中忠实地重新创建查询一样,但实际上你的坐标是向后定义的。尝试交换您的值,您应该开始看到您期望的文档。
答案 1 :(得分:0)
@evanchooly不行。目前数据:
{“_ id”:ObjectId(“55bf2b465ef98ff39dba049c”),“loc”:{“type”: “点”,“坐标”:[ - 4.427237,36.733284]},“标题”: “item1”,“summary”:“摘要item1”,“itemType”:“TXT”} {“_ id”: ObjectId(“55bf2ddc5ef98ff39dba049d”),“loc”:{“type”:“Point”, “coordinates”:[ - 3.427237,35.733284]},“title”:“item2”, “summary”:“Summary item2”,“itemType”:“TXT”} {“_ id”: ObjectId(“55bf419d79711904641950e3”),“loc”:{“type”:“Point”, “coordinates”:[ - 2.427237,36.733284]},“title”:“item3”, “摘要”:“摘要item3”,“itemType”:“TXT”} {“_ id”: ObjectId(“55bf74bd7971191d180d67ad”),“loc”:{“type”:“Point”, “coordinates”:[ - 5.427237,35.733284]},“title”:“item4”, “摘要”:“摘要item4”,“itemType”:“TXT”}
geo[0]=-4.4272;
geo[1]=36.733;
使用lat / long(如前所述)Morphia返回所有元素,尽管半径为2 / 111.12或20000 / 111.12。
如你所说,使用long / lat,Morphia返回空列表,半径为2 / 111.12到107 / 111.12。使用半径108 / 111.12返回item2和item3。半径从109 / 111.12到20000 / 111.12返回所有元素。
我不明白为什么。我想也许Morphia的查询不好,Morphia找不到“loc”,所以Morphia全部归还。我一直在搜索谷歌,查询应该没问题。
编辑:
如果我在mongo控制台中运行以下命令:
db.runCommand ( {geoNear: "ItemVo", near : [-4.427, 36.733 ] , maxDistance: 20000, spherical:true })
每个返回的元素都包含距离。例如:
{“dis”:0.00000596312302919342,“obj”:{“_ id”: ObjectId(“55bf2b465ef98ff39dba049c”),......}}},
我不明白为什么距离值与呼叫不同:
db.ItemVo.find({loc:{"$near":{ "$geometry": {type: "Point", coordinates: [-4.427, 36.73]}, "$maxDistance": 20000}}})
答案 2 :(得分:0)
我最近解决了这个问题,并希望将解决方案提交给其他人也有同样的问题。我不知道为什么它现在有用,也许是因为我使用了更新版本的Morphia。 Mi代码:
public List<ItemVo> findItems (Double latitude, Double longitude, Double radius){
LOGGER.info("[ItemDAO - findItems] - init");
str = getDs().createQuery(ItemVo.class).field("loc").near(latitude, longitude, radius/111.12, true).asList();
return str;
}
在webservice中收到参数“radius”(整数,以千米为单位),我们在调用itemDAO.findItems之前对其进行转换:
//private static Double FORMAT_RADIUS = 0.01;
Double radius_format = radius * FORMAT_RADIUS;