2012-07-09 3 views
1

Dire que j'ai deux classes comme suit:Spring données Mongo - Exclure les champs dans la requête de l'objet référencé par @DbRef

public class Person { 

    private String personId; 

    private String name; 

    private Address address; 

} 

public class Order { 

    private String orderId; 

    @DbRef 
    private Person customer; 

} 

Ce que je voudrais faire est de lancer une requête sur la prise des commandes, mais seulement retour spécifique champs de l'objet personne liée, quelque chose comme:

public Order findByOrderId(String orderId) { 
    Query query = query(where("orderId").is(orderId)); 
    query.fields().exclude("person.address"); 
    return operations.findOne(query,Order.class); 
} 

je reçois les données renvoyées mais mon exclure l'argument ne semble pas être appliquée si elle est sur un objet enfant relié par @DbRef. Je peux exclure les attributs de l'objet Order sans problème. Le problème que j'ai est que le document de personne peut devenir assez grand et je veux avoir le contrôle sur le trafic de réseau en obtenant des objets de commande (c'est-à-dire seulement obtenir des données comme j'en ai besoin).

J'utilise la version 1.0.0.M5 du printemps-données MongoDB

Est-ce que quelqu'un sait si ce type d'opération est prise en charge?

Un grand merci

Joe

Répondre

2

C'est actuellement pas possible. La raison en est que nous traduisons de manière transparente les objets DBRef provenant du magasin à l'aide de la méthode fetch() qui, malheureusement, ne prend pas un argument de spécification de champ. Je suggère d'ouvrir un ticket dans le bug tracker du driver Java de MongoDB ainsi qu'un ticket pour Spring Data MongoDB afin de nous permettre de récupérer la méthode ajoutée qu'ils pourraient introduire.

Une solution de contournement pour cela pourrait effectivement être de mapper l'objet comme DBRef à l'intérieur de votre classe de domaine et de le résoudre manuellement dans l'objet réel en déclenchant un findOne(…) avec les exclusions imbriquées spécifiées.

0

Une autre solution pourrait consister à étendre AbstractMongoEventListener et passer outre onAfterConvert méthode et l'exposer comme Bean Spring

Ici, vous aurez accès à l'objet de commande et peut alors mettre tout ce que vous ne voulez pas null.

Vous obtiendrez toujours des champs vides avec des valeurs par défaut, mais la taille sera beaucoup plus petite

Vous pouvez également écrire une coutume personinfo classe qui n'a que les champs dont vous avez besoin et définissez à l'ordre des objets ainsi que réglage Peson à null

Questions connexes