3

我正在寻找一种将位置值插入到 MongoDB 中的集合的方法。我正在使用 MongoDB JAVA 驱动程序。不幸的是,我不能这样做。

该集合已正确索引。这里的问题是集合以包含双值的数组的形式接受位置。但我不确定是否有办法直接发送数组,因为只发送数组的引用而不发送实际内容。

代码低于 double latLong[] = {124.6682391, -17.8978304}; final BasicDBObject loc = new BasicDBObject(); loc.put("类型","点"); loc.put("坐标", latLong);

jsonObject.put("location", loc);

添加后,当我尝试打印它时,我得到以下输出。

"location" : { "type" : "Point" , "coordinates" : "[D@53e21fa6"} 

这会导致“无法从对象中提取地理键、格式错误的几何?:”错误。

我尝试将位置作为数组列表发送。但这再次将值存储为

"location" : { "type" : "Point" , "coordinates" : "[144.6682362, -37.8978302]"} 

但不像

"location" : { "type" : "Point" , "coordinates" : [144.6682362, -37.8978302]} 

这再次导致“无法从对象中提取地理键,格式错误的几何?:”错误。

还尝试了 Arrays.toString((latLong))

这导致

" location" : { "type" : "Point" , "coordinates" : "[144.6682362, -37.8978302]"} 

因此再次出现同样的错误。

下面的 URL 说这无法完成。 https://groups.google.com/forum/#!topic/mongodb-user/TUjAxag6yT4

但是我的大脑仍然有一部分说应该有办法。

知道如何通过将 JSON 对象转换为 DBObject 来将位置对象(这是一个包含双值的数组)添加到 JSON 对象,从而添加到集合中吗?

我不是在寻找 POJO 库,因为我想坚持使用我的本机代码。如果无能为力,我可能会跳到 POJO 库。

4

2 回答 2

3

您必须创建坐标的 jsonarray,然后将其放入 jsonObject。尝试这样的事情:

        double latLong[] = {124.6682391, -17.8978304};
        JSONArray jsonArray = new JSONArray(latLong);
        JSONObject jobj = new JSONObject().put("type", "point");
        jobj.put("coordinates", jsonArray);

        // below  jsonObject_loc contains the jsonobject as you want..
        JSONObject jsonObject_loc = new JSONObject();
        jsonObject_loc.put("loc", jobj);
        System.out.println(jsonObject_loc);

       // but you have to store jobj in db as your query already has 'loc' object
        BasicDBObject loc = new BasicDBObject();
        loc.put("loc", jobj.toString());

用于上述代码的 JSON 库是:java-json

于 2013-10-18T12:34:58.543 回答
0

这个问题很老了,但是最近我遇到了类似的问题,并找到了使用从 sonatype 下载的 mongo-java-driver-2.13.3.jar 的简单方法一种 可能性是直接将坐标放在 BasicDBObject 中,如下所示:

double latLong[]= {124.6682391, -17.8978304};
BasicDBObject loc1= new BasicDBObject("location", 
                     new BasicDBObject("type", "Point")
                    .append("coordinates", latLong));

System.out.println("DEBUG: loc1 is: " + loc1.toString());

结果是:

DEBUG: loc1 is: { "location" : { "type" : "Point" , "coordinates" : [ 124.6682391 , -17.8978304]}}

我发现更好的另一种可能性是将 BasicDBList 像这里一样:

BasicDBList coords= new BasicDBList();
coords.add(Double.valueOf(124.6682391));
coords.add(Double.valueOf(-17.8978304));
BasicDBObject loc2= new BasicDBObject("location", 
    new BasicDBObject("type", "Point")
   .append("coordinates", (latLong)));

System.out.println("DEBUG: loc2 is: " + loc2.toString());

结果又是:

DEBUG: loc2 is: { "location" : { "type" : "Point" , "coordinates" : [ 124.6682391 , -17.8978304]}}
于 2017-06-02T12:49:13.183 回答