Spring Data Mongo - 查询方法和唯一字段

5

我目前正在使用Spring Data Mongo开发一个项目。

我的repository只是一个扩展了MongoRepository的接口。我想添加一个自定义查询方法,以检索集合中某个字段的所有不同值。

我尝试了以下代码:

@RepositoryRestResource(path = "devices", collectionResourceRel = "deviceInfos")
public interface DeviceInfoRepository extends MongoRepository<DeviceInfo, String> {

    @RestResource(path = "distinctUnitIds")
    List<String> findDistinctUnitIdBy();

}

使用这段代码后,Spring给我报错了,因为它无法构建我的列表。所以我尝试了以下代码:

@RepositoryRestResource(path = "devices", collectionResourceRel = "deviceInfos")
public interface DeviceInfoRepository extends MongoRepository<DeviceInfo, String> {

    @RestResource(path = "distinctUnitIds")
    List<DeviceInfo> findDistinctUnitIdBy();

}

那段代码可以工作,但distinct似乎完全被忽略了。

有关查询方法中Distinct的文档真的不清楚...

我做错了什么吗?使用Spring Data获取字段的唯一值的最佳方法是什么?

谢谢!

2个回答

7
您需要使用Spring Data的MongoTemplate - MongoRepository接口仅适用于基本功能,如果您需要更精细的控制查询内容,则最好使用MongoTemplate。
以下是从集合中获取不同值的示例:
Criteria criteria = new Criteria();
criteria.where("dataset").is("d1");
Query query = new Query();
query.addCriteria(criteria);
List list = mongoTemplate.getCollection("collectionName")
    .distinct("source",query.getQueryObject());

这是更多信息的链接:MongoDB MongoTemplate如何根据一些条件获取独特的字段

1
谢谢你的回答。我也预料到会是这样的。你知道参考指南中描述的findDistinctBy是什么吗? - Brice Argenson
关键字distinct在mongo存储库中不受支持,请在此处检查支持的关键字http://docs.spring.io/spring-data/data-document/docs/current/reference/html/#mongodb.repositories.queries - Sigrist

2
在SpringBoot2中,您可以执行以下操作:

最初的回答:

DistinctIterable<String> iterable = mongoTemplate.getCollection(COLLECTION_NAME).distinct("source",in(FieldValue,query.getQueryObject(), String.class);
        MongoCursor<String> cursor = iterable.iterator();
        List<String> list = new ArrayList<>();
        while (cursor.hasNext()) {
            list.add(cursor.next());
        }
        return list;

我对你的回答不是很清楚。你能否请贴出完整的解决方案? - PAA
请问您能在这里提供指导吗:https://stackoverflow.com/questions/55535331/spring-data-mongo-issue-with-distinct-collection? - PAA
@PAA 两者差不多,只是上面的例子使用了迭代器来支持可扩展性-这是值得推荐的。如果您还有任何问题,请告诉我。 - Karthikeyan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接