2011-08-19 7 views
0

En utilisant Java ... pas que cela soit important.MongoDB - DBRef à un DBObject

Avoir un problème et c'est peut-être juste un problème de conception.

J'affecte le champ "_id" à tous mes documents, même ceux qui sont intégrés. J'ai un document parent (et la collection pour ceux) qui a un document incorporé

J'ai donc quelque chose comme:

{ "_id" : "49902cde5162504500b45c2c" , 
    "name" : "MongoDB" , 
    "type" : "database" , 
    "count" : 1 , 
    "info" : { "_id" : "49902cde5162504500b45c2y", 
      "x" : 203 , 
      "y" : 102 
      } 
} 

Maintenant, je veux avoir un autre document qui fait référence à mon « info » via un DBRef, ne veulent pas une copie. Donc, je crée un DBRef qui pointe vers la collection du document parent et spécifie le _id comme xxxx5c2y. Toutefois, l'appel fetch() sur le DBRef donne une valeur NULL.

Cela signifie-t-il que DBRef et fetch() fonctionne uniquement sur les champs "_id" d'entrée de collection de niveau supérieur?

Je m'attendais à ce que fetch() consomme toutes les clés: valeurs dans les accolades du document .. mais peut-être que cela demande trop. Est-ce que quelqu'un sait?? Est-il impossible de créer des références inter-documents, sauf au niveau supérieur?

Merci

Répondre

1

Oui, vos références _id DBRef doivent être aux documents dans votre collection, pas aux documents intégrés.

Si vous voulez trouver le document incorporé, vous devrez faire une requête sur info._id et vous aurez besoin d'ajouter un index là-dessus aussi (pour la performance) OU vous aurez besoin de stocker ce document incorporé dans un collecter et traiter l'enchâssé comme une copie. La copie est OK dans MongoDB ... 'un seul fait' ne s'applique pas ici ... à condition que vous ayez un moyen de mettre à jour la copie lorsque la copie principale change (cohérence éventuelle). Sur la base de DBRef, les directives officielles indiquent que «la plupart des développeurs utilisent DBRefs uniquement si la collection peut changer d'un document à l'autre.Si votre collection référencée sera toujours la même, les références manuelles décrites ci-dessus sont plus efficaces. "

En outre, pourquoi voulez-vous référencer info dans un document? Si c'était un tableau, je pourrais comprendre pourquoi vous pourriez vouloir faire référence à des entrées individuelles, mais comme il ne semble pas être un tableau dans votre exemple, pourquoi ne pas se référer au document contenant par son _id?

+0

Merci pour vos commentaires. Ok, DBRef ... docs de premier niveau seulement. Je suis d'accord avec vos autres commentaires concernant la copie, mais si les choses changent et que l'on élabore un modèle d'événement pour mettre à jour de nombreuses localisations, cela doit être en place. Mon exemple (modèle de données) n'était pas vraiment représentatif du modèle de problèmes, c'est un cas où l'objet "info" est vraiment un méta-modèle dans mon problème sapce, qui est utilisé pour l'analyse de modèle. Ainsi, les modifications apportées au parent (et aux sous-documents du parent) doivent mettre à jour le méta-modèle. Je ne peux pas les intégrer car cela signifie que les changements doivent mettre à jour des millions de lieux. – Robert

Questions connexes