我正在寻找一种方法来将位置值插入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库。
答案 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]}}