MongoDB - 如何将位置插入集合

时间:2013-10-18 12:03:02

标签: java arrays json mongodb

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

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

代码如下     double latLong [] = {124.6682391,-17.8978304};     final BasicDBObject loc = new BasicDBObject();     loc.put( “类型”, “点”);     loc.put(“coordinates”,latLong);

jsonObject.put("location", loc);

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

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

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

我尝试将位置作为arraylist发送。但这又将值存储为

"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]"} 

因此又出现同样的错误。

以下网址表示无法完成此操作。 https://groups.google.com/forum/#!topic/mongodb-user/TUjAxag6yT4

但我脑子的某些部分仍然说应该有办法。

是否知道如何通过将JSON对象转换为DBObject来将位置对象(具有双值的数组)添加到JSON对象,从而添加到集合中?

我不是在寻找POJO库,因为我想坚持我的原生代码。如果无法做到,我可以跳到POJO库。

2 个答案:

答案 0 :(得分: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

答案 1 :(得分: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]}}