19

有没有人尝试distinct使用Spring Data for Mongo. 如果您有示例,请发布。我应该在哪里以及如何包含distinct flag

链接到 Spring Data Mongo 示例——Example 4.4. Query creation from method names

// Enables the distinct flag for the query
List<Person> findDistinctPeopleByLastnameOrFirstname(String lastname, String firstname);
List<Person> findPeopleDistinctByLastnameOrFirstname(String lastname, String firstname);
4

7 回答 7

28

经过一番摸索,我想出了以下解决方案,该解决方案可以并且可以工作,但可能可以改进。我对 Spring 还是很陌生,所以如果您有更好的想法,请告诉我。

无论如何,这里是:

首先,我们使用@Autowired注解从 spring-data-mongodb 引入基础 MongoTemplate

@Autowired
MongoTemplate mongoTemplate;

一旦我们有了它,我们就可以使用它来进行一些查询。请注意,这是有点臭的部分,因为您必须告诉 Spring 返回类型是什么,而它并不真正喜欢那样......</p>

// Get the distinct stuff from MongoDB
List<String> coll = mongoTemplate.getCollection("mycollection").distinct("myfield");

在上面的代码中,您会注意到我定义了一个名为 coll 的 List 类型变量,它使用该@Autowired MongoTemplate变量获取一个集合,然后使用 distinct 获取一个字段。这类似于db.whatever.distinct("term")在 Mongo shell 上。

于 2013-11-06T05:56:23.513 回答
10

我的环境:spring-data-mongodb 2.0.5,jdk1.8,

这是我的代码示例:

import com.mongodb.client.DistinctIterable;
import com.mongodb.client.MongoCollection;
import com.mongodb.client.MongoCursor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.stereotype.Repository;
import java.util.ArrayList;
import java.util.List;


public List<String> queryAllCategory() {
    List<String> categoryList = new ArrayList<>();
    MongoCollection mongoCollection = mongoTemplate.getCollection("lexicon");
    DistinctIterable distinctIterable = mongoCollection.distinct("category",String.class);
    MongoCursor cursor = distinctIterable.iterator();
    while (cursor.hasNext()) {
        String category = (String)cursor.next();
        categoryList.add(category);
    }
    return categoryList;
}

关于不同的方法,请阅读: http: //mongodb.github.io/mongo-java-driver/3.7/javadoc/com/mongodb/client/MongoCollection.html#distinct-java.lang.String-java.lang.Class -

于 2018-10-15T07:58:57.957 回答
6

自从发布此问题以来,很多情况都发生了变化。回答我自己的问题,因为这个问题不断出现。

从那时起就有3.0更高的支持

public DistinctIterable<String> getUniqueTask() {
    return mongoTemplate.getCollection(TABLE).distinct("FIELD", String.class);
}

旁注:您甚至可以向此查询添加过滤器/正则表达式。阅读文档。如果找不到,ping,将发布答案。

于 2019-04-09T16:49:01.487 回答
4

目前 MongoDB 不支持以不同的方式检索文档。它只支持使用distinct 命令返回不同的字段值。

因为它显然是您正在寻找的后者,所以坏消息是,我们目前不支持派生查询中的任何预测。有关这方面的进展,请关注相关的 JIRA票证

于 2013-10-07T19:56:39.183 回答
3

您可以在此处查看 Spring Data JPA 和 Spring Data MongoDB 之间 distinct 的使用差异:

@Before
public void setUp() {

    this.dave = customers.save(new Customer("Dave", "Matthews"));
    this.carter2 = customers.save(new Customer("Carter", "Z"));
    this.carter = customers.save(new Customer("Carter", "Beauford"));
}

@Test
public void distinctProjectsEntityIntoInterface() {

    Collection<CustomerProjection> result = customers.findAllProjectedDistinctBy();

    assertThat(result, hasSize(2));
}

春季数据jpa中的不同

@Before
public void setUp() {

    customers.deleteAll();

    this.dave = customers.save(new Customer("Dave", "Matthews"));
    this.carter2 = customers.save(new Customer("Carter", "Z"));
    this.carter = customers.save(new Customer("Carter", "Beauford"));
}

@Test
public void distinctProjectsEntityIntoInterface() {

    Collection<CustomerProjection> result = customers.findAllProjectedDistinctBy();

    assertThat(result, hasSize(3));
}

在春季数据MongoDB中不同

在哪里

interface CustomerProjection {

    String getFirstname();
} 
于 2017-04-01T14:15:28.947 回答
0

你可以在 MongoOperations 的帮助下做到这一点——

Query query = new Query(where("field").in(requestIds));
List<String> result =  mongoOperations.findDistinct(query, "fieldName",                                                                              "collectionName",                                                                    String.class);

使用 MongoTemplates -

mongoTemplate.getCollection("collectionName").distinct("filedName", requestIds);
于 2020-02-06T06:55:21.310 回答
0

如果您想要字符串列表中的不同值列表,

List<String> emailIds = mongoTemplate.query(Person.class).distinct("email").as(String.class).all();
于 2020-04-02T11:02:53.457 回答