web-dev-qa-db-fra.com

Comment retourner uniquement des champs spécifiques pour une requête dans Spring Data MongoDB?

Comment pouvons-nous sélectionner des champs spécifiques dans Spring Data Mongo. J'ai essayé ce qui suit, mais j'ai obtenu une exception de Foo à String.

Utiliser @Query

@Query(value="{path : ?0}", fields="{path : 0}")
String findPathByPath(String path);

Non @Query

String findPathByPath(String path);

Voici le modèle de document

@Document(collection = "foo")
public class Foo  {

  String name, path;
  …
}
15
richersoon

MongoDB renvoie uniquement les documents JSON pour les requêtes standard. Vous pouvez obtenir ce que vous souhaitez voir en retournant tout de même un List<Foo>. La propriété fields dans @Query fera en sorte que seuls les champs définis sur 1 soient retournés.

@Query(value="{ path : ?0}", fields="{ path : 0 }")
List<Foo> findByPath(String path);

Nous vous recommandons généralement d’introduire un DTO dédié à cet effet afin d’empêcher que l’instance Foo partiellement remplie ne soit transmise à save(…) à son tour.

Une autre option consiste à utiliser le cadre d'agrégation, mais c'est plus complexe.

16
Oliver Drotbohm

Vous pouvez utiliser 

public interface PersonRepository extends MongoRepository<Person, String>

  @Query(value="{ 'firstname' : ?0 }",fields="{ 'firstname' : 1, 'lastname' : 1}")
  List<Person> findByThePersonsFirstname(String firstname);

}

Plus d'informations dans les données de printemps documentation

14
Nikhil Kumar K

Vous pouvez utiliser 

Query query = new Query();

query.fields().include("path");
9
Pankaj Mandale

Vous pouvez utiliser la requête ci-dessous pour obtenir des champs spécifiques.

@Query(fields="{path : 1}")
Foo findPathByPath(String path);

Records présents dans DB

{
    "name" : "name2",
    "path" : "path2"
},
{
    "name" : "name3",
    "path" : "path3"
}

La requête ci-dessous renvoie l'objet Foo si path = Path3

{
    "name": null,
    "path": "path3"
}

nous devons spécifier les champs obligatoires avec fieldName: 1 et, si vous n'en avez pas besoin, spécifiez-le avec 0.

1
Ajit Nikam