附近找不到地理空间和Morphia

Geospatial and Morphia not find by near

我有以下数据库:

db.ItemVo.find()

{ "_id" : ObjectId("55bf2b465ef98ff39dba049c"), "loc" : { "type" : "Point", "coordinates" : [ -4.427237, 36.733284 ] }, "title" : "item1", "summary" : "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", coordinates: [-4.427, 36.73]}, "$maxDistance": 20000}}})

{ "_id" : ObjectId("55bf2b465ef98ff39dba049c"), "loc" : { "type" : "Point", "coordinates" : [ -4.427237, 36.733284 ] }, "title" : "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 return集合中的所有元素,$near 未找到。 Morphia 应该 return 只有元素 "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;

谢谢。

好的。我已经找到了它,它很简单。出于我不理解的原因,mongo shell 在 lat/long 中获取坐标,而吗啡在 long/lat 中获取坐标。因此,虽然它 看起来 就像您忠实地在吗啡中重新创建查询,但实际上您的坐标是倒着定义的。尝试交换您的价值观,您应该会开始看到您期望的文档。

@evanchooly 不工作。当前数据:

{ "_id" : ObjectId("55bf2b465ef98ff39dba049c"), "loc" : { "type" : "Point", "coordinates" : [ -4.427237, 36.733284 ] }, "title" : "item1", "summary" : "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", "summary" : "Summary item3", "itemType" : "TXT"} { "_id" : ObjectId("55bf74bd7971191d180d67ad"), "loc" : { "type" : "Point", "coordinates" : [ -5.427237, 35.733284 ] }, "title" : "item4", "summary" : "Summary item4", "itemType" : "TXT"}

geo[0]=-4.4272;
geo[1]=36.733;

与lat/long(和以前一样)Morphia returns所有元素,尽管半径为2/111.12 或20000/111.12。

如您所说 long/lat,Morphia returns 空列表,半径从 2/111.12 到 107/111.12。半径为 108/111.12 returns item2 和 item3。半径从 109/111.12 到 20000/111.12 returns 所有元素。

我不明白为什么。我想可能是Morphia的查询不好,Morphia没有找到"loc",所以Morphia returns全部。我一直在搜索 google,查询应该没问题。

编辑:

如果我 运行 在 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}}})

我最近解决了它,想把解决方案提供给其他有同样问题的人。我不知道为什么它现在可以工作了,也许是因为我使用了更新版本的 Morphia。小米码:

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;