2017-10-16 18 views
1

Bien que cela fonctionne dans mongo:valeurs Distinct avec GeoQuery travaille à Mongo, mais pas au printemps

> db.collection.distinct("key", {"position":{$geoWithin:{$box: [[-6.8, 36.7], [-0.5, 43.8]]}}}) 
> [ "A", "B" ] 

Au printemps renvoie une erreur

Criteria criteria = Criteria.where("position").within(box); 
     Query query = new Query(); 
     query.addCriteria(criteria); 
List<String> result = mongoOperations.getCollection("collection") 
       .distinct("key", query.getQueryObject()); 

java.lang.IllegalArgumentException: ne peut pas sérialiser classe org.springframework.data.mongodb.core.query.GeoCommand à org.bson.BasicBSONEncoder._putObjectField (BasicBSONEncoder.java:299) ~ [mongo-java-driver-2.14.3.jar: na] à org.bson .BasicBSONEncoder.putObject (BasicBSONEncoder.java:194) ~ [mongo-jav a-driver-2.14.3.jar: na] à org.bson.BasicBSONEncoder._putObjectField (BasicBSONEncoder.java:255) ~ [mongo-java-driver-2.14.3.jar: na] à org.bson. BasicBSONEncoder.putObject (BasicBSONEncoder.java:194) ~ [mongo-java-pilote-2.14.3.jar: na] à org.bson.BasicBSONEncoder._putObjectField (BasicBSONEncoder.java:255) ~ [pilote mongo-java-driver- 2.14.3.jar: na] à org.bson.BasicBSONEncoder.putObject (BasicBSONEncoder.java:194) ~ [mongo-java-driver-2.14.3.jar: na] à org.bson.BasicBSONEncoder.putObject (BasicBSONEncoder.java:136) ~ [mongo-java-driver-2.14.3.jar: na] à com.mongodb.DefaultDBEncoder.writeObject (DefaultDBEncoder.java:36) ~ [mongo-java-driver-2.14.3. jar: na] à com.mongodb.OutMessage.putObject (OutMessage.java:289) ~ [mongo-java-driver-2.14.3.jar: na] à com.mongodb.OutMessage.writeQuery (OutMessage.java:211) ~ [mongo-java-driver-2.14.3.jar: na] à com.mongodb.OutMessage.query (OutMessage.java:86) ~ [mongo -java-driver-2.14.3.jar: na]

Répondre

0

Je n'ai pas été en mesure de faire du code @Christoph Strobl même pour compiler!

J'ai finalement utilisé mongo-java-pilote pour obtenir les valeurs distinctes:

MongoClient mongoClient = new MongoClient(); 
    MongoDatabase database = mongoClient.getDatabase(dbName); 
    MongoCollection<org.bson.Document> collection = database.getCollection(COLLECTION); 
    Bson query = Filters.geoWithinBox("position", 
      x1, y1, x2, y2); 

    DistinctIterable<String> resultList = collection.distinct("key", query, String.class); 

    Set resultSet = new HashSet(); 
    resultList.forEach(new Block<String>() { 
     @Override 
     public void apply(final String result) { 
      resultSet.add(result); 
     } 
    }); 

    return resultSet; 
0

Je vois la nécessité de passer directement par l'API du pilote Java MongoDB en utilisant les opérations de la collection . Toutefois, Query.getQueryObject() ne peut pas être directement utilisé avec le pilote sous-jacent car il est transformé par le QueryMapper. Pour l'instant, vous pouvez essayer de faire le mapping par vous-même.

QueryMapper mapper = new QueryMapper(mongoOperations.getConverter()); 
org.bson.Document mappedQuery = mapper.getMappedObject(query.getQueryObject(), Optional.empty()); 

List<String> result = template.getCollection("collection") 
    .distinct("key", mappedQuery, String.class) 
    .into(new ArrayList<>()); 

Il y a aussi DATAMONGO-1761 (toujours ouvert dur) qui cherchent à ajouter le support pour distinct-MongoOperations.