geoQuery 的不同值适用于 Mongo 但不适用于 Spring

Distinct values with geoQuery works in Mongo but not in Spring

虽然这在 mongo 中有效:

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

在springreturns一个错误

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

我确实看到需要通过 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

我连@Christoph Strobl 的代码都无法编译!

我终于使用了 mongo-java-驱动程序来获取不同的值:

    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;