Отличается в Spring Data MongoDB

Кто-нибудь пытался включить distinct в свой запрос с помощью Spring Data for Mongo. Если у вас есть пример, вы можете отправить его. Где и как включить distinct flag?

Ссылка на пример Spring данных 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);

Ответ 1

С тех пор, как этот вопрос был опубликован, лот изменился. Отвечая на мой собственный вопрос, так как этот вопрос продолжает появляться.

Поддержка есть с 3.0 и выше

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

Примечание: вы даже можете добавить фильтры/регулярные выражения в этот запрос. Читайте документы. Если вы не можете найти, пинг, опубликует ответ.

Ответ 2

После небольшого соткания я придумал следующее решение, которое в порядке и работает, но, вероятно, можно улучшить. Я до сих пор довольно новичок в Spring, поэтому, если у вас есть идея лучше, пожалуйста, дайте мне знать.

В любом случае, вот оно:

Во-первых, мы используем аннотацию @Autowired для ввода базы MongoTemplate из spring -data-mongodb

@Autowired
MongoTemplate mongoTemplate;

Как только мы получим это, мы сможем использовать его для выполнения некоторых запросов. Обратите внимание, что это немного вонючая часть, потому что вы должны сообщить Spring, что такое тип возвращаемого значения, и ему это действительно не нравится...

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

В приведенном выше коде вы заметите, что я определил переменную типа List, называемую coll, которая использует переменную @Autowired MongoTemplate, чтобы получить коллекцию, а затем поле с использованием отдельных. Это аналогично db.whatever.distinct("term") на оболочке Монго.

Ответ 3

В настоящее время MongoDB не поддерживает извлечение документов определенным образом. Он поддерживает только возвращаемые значения полей с помощью команды .

Поскольку, по-видимому, последний вы ищете, плохая новость заключается в том, что мы в настоящее время не поддерживаем никаких прогнозов в производных запросах. Для достижения прогресса в этом, пожалуйста, следуйте соответствующему JIRA билет.

Ответ 4

Вы можете увидеть различия в использовании различий между Spring данными JPA и Spring данными MongoDB здесь:

@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));
}

отличается от Spring данных 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));
}

отличается от Spring данных mongodb

где

interface CustomerProjection {

    String getFirstname();
} 

Ответ 5

Моя среда: 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. [ CN10]