2011-10-28 3 views
2

Je suis tombé sur une situation où il serait préférable de représenter une partie particulière de mon modèle de domaine comme relationnel. J'ai lu la section sur database references dans MongoDB et je comprends que vous pouvez fournir des références à plusieurs documents en fournissant un tableau JSON de références $ ref à divers documents dans une collection étrangère.Référence à plusieurs documents étrangers avec MongoDBRef dans MongoDB

Tous les exemples que j'ai vu pour ajouter une référence à un document étranger dans le code ont été seulement pour un seul document et ils ont créé une propriété publique de type MongoDBRef. À mon avis, il y a beaucoup de frais généraux inutiles à cette approche, mais cela ne précise pas non plus ce qu'il faut faire pour conserver des références à plusieurs documents.

Si vous souhaitez fournir une relation un-à-plusieurs entre des documents étrangers dans Mongo, est-il nécessaire de fournir une propriété de collection contenant des objets MongoDBRef? Est-il possible de coller à une collection d'objets entité standard dans mon code C# et le mapper aux documents Mongo en utilisant BsonClassMap?

Voici une classe simple qui représente le modèle que j'ai actuellement. Il semble enregistrer le document et les références correctement, mais je n'aime pas exposer une collection publique d'objets MongoDBRef et la surcharge nécessaire pour ajouter de nouveaux documents pour quiconque utilise la classe Person.

Si cela compte, j'utilise MongoDB 2.0 et leur pilote C#. DBRefs ne sont pas l'outil approprié pour stocker des références à un type de document connu.

// This is how my class currently looks 
public class Person 
{ 
    public string Name { get; set; } 
    public List<MongoDBRef> Vehicles { get; private set; } 

    public Person() 
    { 
     Vehicles = new List<MongoDBRef>(); 
    } 
} 

// This is what I want my class to look like 
public class Person 
{ 
    public string Name { get; set; } 
    public List<Vehicle> Vehicles { get; private set; } 

    public Person() 
    { 
     Vehicles = new List<Vehicle>(); 
    } 
} 

Répondre

3

Au lieu de cela, enregistrez simplement les valeurs _id des documents référencés dans votre collection. Étant donné une bonne bibliothèque de cartographie (pas sûr de C# mais de l'équivalent en C# de pymongo, de mangouste, de morphine, etc.) cela vous permettra de faire exactement ce que vous voulez. DBRefs ne doit être utilisé que si vous ne savez pas au moment de la compilation le type de document dont vous avez besoin pour stocker une référence (par exemple un champ "contenu" qui contient une Image ou un Texte, etc.).

+0

Merci pour la réponse. Quand vous dites que les équivalents C# me permettent de faire ce que je veux, y a-t-il un nom pour cette fonctionnalité? J'ai lu les documents sur le pilote C#, mais je ne vois rien à ce sujet, alors j'espère que je suis juste en train de négliger quelque chose. – senfo

+1

Ce n'est généralement pas une fonction de pilote et franchement je ne suis pas à la hauteur sur C3. Il semble que c'est un peu confus avec un couple de pilotes différents, certains avec le soutien de LINQ d'autres pas tellement. Si vous êtes bloqué sur C#, vous devrez peut-être le faire manuellement ou chercher des premiers efforts sur github ou google code. –

+1

Pourquoi DBRefs n'est pas approprié lorsque le type de document est connu? –

Questions connexes