2011-07-21 4 views
9

J'utilise le pilote mongodb officiel pour C# dans mon projet de test et j'ai déjà inséré le document de l'application web C# à mongodb. Dans la console mongo, db.blog.find() peut afficher les entrées que j'ai insérées. "Lorsque j'ai essayé de les récupérer, .net lancer une exceptionRécupérer des données de mongodb en utilisant le pilote C#

" System.InvalidOperationException: ReadString ne peut être appelé que lorsque CurrentBsonType est String, pas lorsque CurrentBsonType est ObjectId. "

ma classe d'entité est très simple

namespace MongoDBTest 
{ 
    public class Blog 
    { 
     public String _id 
     { 
      get; 
      set; 
     } 

     public String Title 
     { 
      get; 
      set; 
     } 
    } 
} 

et voici mon récupérer le code

public List<Blog> List() 
{ 
    MongoCollection collection = md.GetCollection<Blog>("blog"); 
    MongoCursor<Blog> cursor = collection.FindAllAs<Blog>(); 
    cursor.SetLimit(5); 
    return cursor.ToList(); 
} 

quelqu'un peut me aider? Merci!

Répondre

10

Je suppose que vous avez juste besoin de marquer votre blog Id avec BsonId (et insérez id vous) attribut:

public class Blog 
{ 
    [BsonId] 
    public String Id {get;set;} 

    public String Title{get;set;} 
} 

Et tout devrait bien se passer. Le problème est dû au fait que vous n'avez pas marqué le champ Mongodb _id et le champ _id généré par le pilote avec le type ObjectId. Et lorsque le pilote tente de le désérialiser, il ne peut plus convertir ObjectId en String.

Exemple complet:

MongoCollection collection = md.GetCollection<Blog>("blog"); 
var blog = new Blog(){Id = ObjectId.GenerateNewId().ToString(), 
         Title = "First Blog"}; 
collection .Insert(blog); 

MongoCursor<Blog> cursor = collection.FindAllAs<Blog>(); 
cursor.SetLimit(5); 

var list = cursor.ToList(); 
+0

salut Andrew Orsich, merci pour votre réponse. –

+0

Bonjour Andrew Orsich, J'ai inséré un document en utilisant ** BsonDocument ** et mongodb génère automatiquement ObjectId pour le document et le stocke, quand j'utilise MongoCollection et appelez la méthode FindAllAs , méthode ReadString throws exception. ** Donc, je mets MongoCollection à MongoCollection et l'objet curseur traversal dans l'instruction foreach pour convertir chaque document en objet blog **. De toute façon, votre réponse m'a aidé à résoudre mon problème, merci :) –

+0

Une solution plus simple serait de changer le type de données de votre ID en ObjectId et de le décorer avec [BsonId].J'ai couru dans le même message d'erreur, et faire ce changement l'a corrigé pour moi. – CodeMonkey1313

1

Jetez un oeil à mon sample project sur GitHub. En retard, je m'intéresse vraiment à MongoDB. Cette application montre beaucoup de choses utiles qui pourraient vous intéresser aussi; modèle de référentiel avec MongoDB.

0

Le type et le nom de l'élément d'identification devrait être différent comme suit

public ObjectId Id { get; set; } 

ObjectId est dans l'espace de noms MongoDB.Bson

2

Récupération des données de l'MongoDB en utilisant C# est assez simple et il y a trois différentes façons les données peuvent être déployées pour frontend

  1. Liste
  2. curseur
  3. LINQ

    using (var cursor = await col.Find(new BsonDocument()).ToCursorAsync()) 
    { 
    while (await cursor.MoveNextAsync()) 
    { 
        foreach (var doc in cursor.Current) 
        { 
         Console.WriteLine(doc); 
        } 
        } 
    } 
    

le code ci-dessus montre pour récupérer les données à l'aide des curseurs. Referrence

+0

Ceci utilise la nouvelle API. Grand merci. –

Questions connexes