2012-10-09 1 views
2

Disons que c'est une collection de 2 documents BSONDeserialize BsonDocument imbriquées et non structurées (pilote mongodb C#)

{ 
    "_id": "...", 
    "name": "Test1", 
    "sub": { 
     "street": "134 Fake Street", 
     "city": "NoWhere" 
    } 
}, 
{ 
    "_id": "...", 
    "name": "Test2", 
    "sub": { 
     "height": "10", 
     "width": "20", 
     "sub2": { 
      "type": "something" 
     } 
    } 
} 

où le premier niveau est une classe structurée, mais les sous-niveaux peuvent être complètement non structurées et peuvent avoir plus documents imbriqués plusieurs niveaux profonds. Comment désérialiser ce document dans une classe C#? Tous les échantillons que j'ai vus supposent une certaine structure dans les documents imbriqués.

La classe suivante donne une erreur:

public class Report 
{ 
    [BsonId] 
    public ObjectId _id { get; set; } 

    public string name { get; set; } 

    public BsonDocument sub { get; set; } 
} 

Type 'MongoDB.Bson.BsonString' with data contract name '...' is not expected. Consider using a DataContractResolver or add any types not known statically to the list of known types - for example, by using the KnownTypeAttribute attribute or by adding them to the list of known types passed to DataContractSerializer.

EDIT

Ce que je suis en train de faire peut-être non-sens complet. Est-ce une meilleure idée d'utiliser un seul BsonDocument et de gérer tout manuellement sans une classe structurée?

+0

essayez d'utiliser une keyword.This dynamique façon dont vos données non structurées seront mis en correspondance avec un complément objet C# à l'exécution time.http: //msdn.microsoft.com/en-us/library/dd264736.aspx –

+0

Je ne pense pas que la dynamique est correctement supportée par le pilote officiel pour le moment. J'ai moi-même lutté contre ce problème, mais j'en suis arrivé à la conclusion que mes documents n'étaient pas aussi ad hoc que je le pensais. Pouvez-vous décrire les variantes de schéma que vous avez? Ou est-ce simplement que vos documents sont inégaux. La différence étant que les variances de schéma signifieraient une structure totalement différente (différents types) tandis que les inégalités pourraient simplement signifier qu'il y a des documents épars. Est-il possible par exemple de décrire l'uber-document qui est un sur-ensemble de toutes les variantes? J'utilise aussi beaucoup le dictionnaire <,> pour les objs complètement variables – cirrus

+0

Le problème est que je peux seulement définir la structure de premier niveau, mais aucun des objets imbriqués. La raison en est que chaque utilisateur peut définir sa propre structure de document et disposer d'une collection de plusieurs «documents-modèles». Les objets si fortement typés sont définitivement supprimés. Je suis nouveau à C#, mais il me semble que le dictionnaire est aussi sorti car il est toujours structuré. –

Répondre

3

Je ne pense pas que le message d'erreur que vous obtenez provient du pilote C#. Pouvez-vous s'il vous plaît fournir une trace de pile?

J'ai essayé de reproduire votre problème, mais cela fonctionne très bien avec mon programme de test. Voir:

http://pastie.org/5032283

Le document inséré par le programme de test ci-dessus ressemble à ceci:

> db.test.find() 
{ "_id" : ObjectId("5075fc6ee447ad1354c1f018"), "name" : "John Doe", "sub" : { "x" : 1, "y" : 2 } } 
> 
+0

C'est l'erreur du navigateur: http: // pastie .org/5033511 –

+0

Merci Robert! Vous avez raison, le problème n'était pas la désérialisation de la classe, ce qui fonctionne bien, mais probablement la négociation de contenu de WebAPI. Si je change mon contrôleur pour retourner une chaîne à la place de la classe, cela fonctionne. Je suppose que l'API ne peut pas gérer la négociation de contenu avec le type BsonDocument. Mon nouveau problème est que sans la négociation de contenu, je reçois une chaîne json "double-traitée" qui ressemble à ceci: "{\" _id \ ": ObjectId (\" 50768abb1934070e98030647 \ "), \" –

+0

va commencer une nouvelle question, je pense que tu as répondu jusque là –

Questions connexes