【问题标题】:Distinct values with geoQuery works in Mongo but not in SpringgeoQuery 的不同值在 Mongo 中有效,但在 Spring 中无效
【发布时间】:2017-10-16 01:06:13
【问题描述】:

虽然这在 mongo 中有效:

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

在spring中返回错误

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: 无法序列化类 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-java-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-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-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]

【问题讨论】:

    标签: spring mongodb geolocation distinct


    【解决方案1】:

    我确实看到需要使用 collection 的操作直接通过 MongoDB Java 驱动程序 API。但是Query.getQueryObject() 不能直接与底层驱动程序一起使用,因为它会被QueryMapper 转换。 目前,您可以尝试自己进行映射。

    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<>());
    

    还有DATAMONGO-1761(仍然开放)寻求将distinct 的支持添加到MongoOperations

    【讨论】:

      【解决方案2】:

      我什至无法让@Christoph Strobl 代码编译!

      我终于使用 mongo-java-driver 来获取不同的值:

          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;
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-07-17
        • 1970-01-01
        • 1970-01-01
        • 2017-05-28
        • 2018-11-14
        • 1970-01-01
        相关资源
        最近更新 更多