printemps de données Mongodb - findBy Méthode pour les objets imbriqués
J'ai deux objets du domaine,
@Document
public class PracticeQuestion {
private int userId;
private List<Question> questions;
//Getters and setters
}
@Document
public class Question {
private int questionID;
private String type;
//Getters and setters
}
Mon JSON doc est comme ça,
{
"_id" : ObjectId("506d9c0ce4b005cb478c2e97"),
"userId" : 1,
"questions" : [
{
"questionID" : 1,
"type" : "optional"
},
{
"questionID" : 3,
"type" : "mandatory"
}
]
}
- Je mettre à jour le "type", basé sur l'id utilisateur et le questionId, j'ai donc écrit un findBy méthode de requête à l'intérieur du Dépôt personnalisée de l'interface,
public interface CustomRepository extends MongoRepository<PracticeQuestion, String> {
List<PracticeQuestion> findByUserIdAndQuestionsQuestionID(int userId,int questionID);
}
Mon problème est que lorsque j'exécute cette méthode avec id d'utilisateur 1 et questionID que 3, il renvoie à l'ensemble des questions de la liste, indépendamment de la questionID. Est la méthode de requête nom valide ou comment dois-je écrire la requête pour les objets imbriqués.
Merci pour toute suggestion.
OriginalL'auteur user1720083 | 2012-10-04
Vous devez vous connecter pour publier un commentaire.
Suffit d'utiliser la
@Query
annotation sur cette méthode.Par l'ajout de la
fields
partie de la@Query
d'annotation, vous dites Mongo pour ne revenir que cette partie du document. Attention cependant, il renvoie toujours l'ensemble du document dans le même format - manque juste tout ce que vous n'avez pas spécifié. Ainsi, votre code sera encore de retourList<PracticeQuestion>
et vous aurez à faire:Oh. Je vois ce que tu veux dire. Vous ne pouvez jamais renvoyer le document entier. La requête semble effectivement pour les documents qui ont que questionID. Mais vous obtenez toujours la totalité du document retourné - jamais juste la question. Ce n'est pas un java chose, c'est un MongoDB chose. Regardez cette question/réponse pour la clarification: stackoverflow.com/a/3985982/229178
Après un peu de travail j'ai réalisé que vous pouvez spécifier partielle des objets dans la
fields
une partie de votre requête (projections
). mongodb.org/display/DOCS/Retrieving+une+sous-ensemble+de+Champs je vais mettre à jour ma réponse ci-dessus, pour donner un exemple.Merci, en attendant je vais aussi essayer qui.
OriginalL'auteur sbzoom
Des expressions de propriété
Des expressions de propriété ne peuvent se référer qu'à une propriété de l'entité gérée, comme montré dans l'exemple précédent. Lors de la création de requêtes temps vous déjà assurez-vous que l'analyse de la propriété est une propriété du domaine géré classe. Cependant, vous pouvez également définir des contraintes en parcourant propriétés imbriquées. Supposons Personnes ont des Adresses avec ZipCodes. Dans ce cas, un nom de méthode de
Liste findByAddressZipCode(code Postal code postal);
crée la propriété de la traversée x.adresse.code postal. L'algorithme de résolution commence avec l'interprétation de l'ensemble de la partie (AddressZipCode) que la propriété et les contrôles le domaine de la classe pour une propriété de ce nom (ni majuscules). Si l'algorithme réussit, elle utilise cette propriété. Sinon, l'algorithme se divise la source du camel cas de pièces à partir de la droite dans une tête et une queue et essaie de trouver la propriété correspondante, dans notre exemple, AddressZip et le Code. Si l'algorithme trouve une propriété avec qui tête de, il prend la queue et continuer la construction de l'arbre vers le bas à partir de là, le fractionnement de la queue de la manière décrite ci-dessus. Si la première division ne correspond pas, l'algorithme de déplacer le point de split vers la gauche (Adresse, code Postal) et continue.
Bien que cela devrait fonctionner pour la plupart des cas, il est possible pour l'algorithme de sélectionner le mauvais propriété. Supposons que la classe Personne a un addressZip bien ainsi. L'algorithme de correspondance dans la première scission tour déjà, et essentiellement de choisir le mal bien et enfin de l'échec (comme le type de addressZip n'a probablement pas de code de la propriété). Pour résoudre cette ambiguïté, vous pouvez utiliser _ à l'intérieur de votre nom de méthode pour définir manuellement la traversée de points. Donc, notre nom de la méthode serait la fin:
UserDataRepository:
Liste findByAddress_ZipCode(code Postal code postal);
UserData findByUserId(String userId);
ProfileRepository:
Profil findByProfileId(String profileId);
UserDataRepositoryImpl:
UserData userData = userDateRepository.findByUserId(userId);
Profil = profileRepository.findByProfileId(userData.getProfileId());
userData.setProfile(profil);
Échantillon Pojo :
Pour le Document ci-dessus/POJO dans votre Classe de Dépôt:
UserData findByProfile_Email(String email);
Pour ref : http://docs.spring.io/spring-data/data-commons/docs/1.6.1.RELEASE/reference/html/repositories.html
OriginalL'auteur Govardhana Rao Ganji
Vous devez utiliser Mongo Agrégation cadre :
1) Créer une méthode personnalisée pour mongo référentiel : Ajouter personnalisé méthode de Dépôt
2) Vous devez cretae une classe(Parce que se détendre opération a modifié la structure de classe) comme ci-dessous :
Cela vous donnera seulement celles résultat qui correspond à la
userId
etquestionId
Résultat pour userId: 1 et questionId : 111 :
OriginalL'auteur Mehraj Malik