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;
虽然这在 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;