2011-04-10 4 views
2

Je suis nouveau sur MongoDB et je me posais des questions sur les objets de domaine avec des BsonClassMaps enregistrés. Considérez les mappings suivants:C# MongoDB Query avec BsonClassMaps

BsonClassMap.RegisterClassMap<VoyageNumber>(cm => 
      { cm.MapField<string>(p => p.Id); }); 

BsonClassMap.RegisterClassMap<Schedule>(cm => 
     { cm.MapField<DateTime>(p => p.EndDate); cm.MapField<DateTime>(p => p.StartDate); }); 

BsonClassMap.RegisterClassMap<Voyage>(cm => 
      { cm.MapIdField<VoyageNumber>(p => p.VoyageNumber); cm.MapField<Schedule>(p => p.Schedule); }); 

L'entité de domaine est "Voyage". Dans cet exemple simple, il s'agit d'un type complexe "Schedule" (avec date de début et date de fin) et un VoyageNumber (avec un champ id de chaîne). "VoyageNumber" est l'identifiant de l'entité.

Maintenant, je peux insérer un nouveau voyage très bien avec:

MongoCollection<Voyage> mongoVoyages = context.MyDB.GetCollection<Voyage>("Voyages"); 

mongoVoyages.Insert<Voyage>(voyage); 

je peux récupérer un voyage via:

MongoCollection mongoVoyages = context.MyDB.GetCollection("Voyages"); 

BsonDocument result = mongoVoyages.FindOneAs<BsonDocument>(); 
BsonDocument sched = result["Schedule"].AsBsonDocument; 
DateTime start = sched["StartDate"].AsDateTime; 
//etc... 

Je voudrais maintenant Bien sûr, comme à la recherche d'un voyage par Id. Comment puis-je y parvenir avec les mappages présentés ci-dessus? J'ai essayé quelque chose comme ceci et ai échoué:

Query.EQ("VoyageNumber", someStringID) 

J'utilise le pilote C# officiel 1.0.

Répondre

1

Avec l'enregistrement des classes ci-dessus, vous aurez le document comme celui-ci dans MongoDB:

{ 
    "_id": { 
    "_id": someStringID 
    }, 
    "Schedule": { 
    "EndDate": "Sun, 10 Apr 2011 13:06:25 GMT +03:00", 
    "StartDate": "Sun, 10 Apr 2011 13:06:25 GMT +03:00" 
    } 
} 

Donc, si vous voulez obtenir Voyage par VoyageNumber Id vous devez utiliser requête suivante:

Query.EQ("_id._id", someStringID) 

Note: Vous n'avez pas besoin de BsonClassMap.RegisterClassMap pour la classe si vous mappez tous les fichiers car il sera sérialisé par défaut sans aucune inscription. Vous pouvez également effectuer une sérialisation personnalisée à l'aide d'attributs tels que [BsonId], [BsonIgnore]. Pour plus de détails, vérifiez documentation ou posez une autre question;).

De la documentation:

Vous pouvez créer cette carte de classe vous ou simplement permettre à la carte de classe à créer automatiquement lors de la première nécessaire (appelé « AutoMapping »). Vous pouvez exercer un certain contrôle sur le processus de AutoMapping soit par décorer vos classes avec attributs liés à la sérialisation ou par en utilisant le code d'initialisation (attributs sont très pratique à utiliser, mais pour ceux qui préfèrent garder sérialisation les détails de leur classes de domaine sont assurés que tout ce qui peut être fait avec des attributs peut aussi être fait sans eux)

+0

Merci, qui travaille et fait avancer ma compréhension du document orienté BDs. Donc vous dites que je n'ai pas besoin de mapper d'autres champs à l'exception de l'IdField? – hoetz

+0

@Malkier: Non, vous n'avez pas besoin de carte du tout. Au moins dans votre exemple. J'ai ajouté quelques notes de la documentation à ma question. –