Quelqu'un at-il essayé d’intégrer distinct
dans leur requête en utilisant Spring Data for Mongo
. Si vous avez un exemple, merci de le poster. Où et comment devrais-je inclure le distinct flag
?
Lien vers l'exemple 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);
Actuellement, MongoDB ne permet pas de récupérer des documents de manière distincte. Il ne prend en charge que le renvoi de valeurs de champs distinctes à l'aide de la commande distinct .
Comme c'est apparemment ce dernier que vous recherchez, la mauvaise nouvelle est que nous ne prenons actuellement en charge aucune projection dans les requêtes dérivées. Pour progresser, suivez les instructions JIRA ticket .
Après avoir fouillé un peu, je propose la solution suivante, qui convient et qui fonctionne, mais qui peut probablement être améliorée. Je suis encore assez nouvelle au printemps, alors si vous avez une meilleure idée, n'hésitez pas à me le faire savoir.
Quoi qu'il en soit, la voici:
Tout d'abord, nous utilisons l'annotation @Autowired
pour importer la base MongoTemplate de spring-data-mongodb
@Autowired
MongoTemplate mongoTemplate;
Une fois que nous avons cela, nous pouvons l'utiliser pour faire des requêtes. Notez que c’est la partie légèrement odorante, car vous devez indiquer à Spring le type de retour et il ne vous plaît pas vraiment.
// Get the distinct stuff from MongoDB
List<String> coll = mongoTemplate.getCollection("mycollection").distinct("myfield");
Dans le code ci-dessus, vous remarquerez que j'ai défini une variable de type liste appelée coll, qui utilise la variable @Autowired MongoTemplate
pour obtenir une collection, puis un champ utilisant distinct. Ceci est analogue à db.whatever.distinct("term")
sur le shell Mongo.
Mon environnement: spring-data-mongodb 2.0.5, jdk1.8,
Voici mon exemple de code:
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;
}
sur la méthode distincte, s'il vous plaît lire: http://mongodb.github.io/mongo-Java-driver/3.7/javadoc/com/mongodb/client/MongoCollection.html#distinct-Java.lang.String-Java.lang .Class-
Vous pouvez voir les différences d'utilisation de distinct entre JPA Spring Data et Spring Data MongoDB ici:
@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));
}
distincte dans les données de printemps 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));
}
Données distinctes au printemps mongodb
où
interface CustomerProjection {
String getFirstname();
}