2011-07-21 37 views
9

Estoy usando el controlador mongodb oficial para C# en mi proyecto de prueba y ya he insertado el documento de la aplicación web C# a mongodb. En la consola mongo, db.blog.find() puede mostrar las entradas que he insertado. pero cuando traté de recuperarlos, .net lanza una excepciónRecuperar datos de mongodb usando el controlador C#

"System.InvalidOperationException: ReadString solo se puede invocar cuando CurrentBsonType es String, no cuando CurrentBsonType es ObjectId."

mi clase de entidad es muy simple

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

     public String Title 
     { 
      get; 
      set; 
     } 
    } 
} 

y este es mi código de recuperar

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

alguien me puede ayudar? ¡Gracias!

Respuesta

10

supongo que sólo es necesario marcar tu blog Id con BsonId (e insertar Identificación del mismo) atributo:

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

    public String Title{get;set;} 
} 

Y todo debería estar bien. El problema se debió a que no marcó qué campo será Mongodb _id y el campo _id generado por el controlador con tipo ObjectId. Y cuando el controlador intenta deserializarlo, no puede convertir ObjectId en String.

Ejemplo completo:

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

hola Andrew Orsich, gracias por su respuesta. –

+0

hola Andrew Orsich, he insertado el documento usando ** BsonDocument ** y mongodb auto generate ObjectId para documento y lo almacena, cuando uso MongoCollection y llamo FindAllAs , el método ReadString arroja una excepción. ** Así que cambio MongoCollection a MongoCollection y el objeto de cursor transversal en la declaración foreach para convertir cada documento a objeto de blog **. De todos modos, tu respuesta me ayudó a resolver mi problema, gracias :) –

+0

Una solución más fácil sería cambiar el tipo de datos de tu ID a ObjectId y decorarlo con [BsonId].Me encontré con el mismo mensaje de error, y hacer ese cambio lo solucionó. – CodeMonkey1313

1

Tome un vistazo a mi sample project en GitHub. Hasta tarde, me he interesado mucho en MongoDB. Esta aplicación muestra muchas cosas útiles que también te pueden interesar; patrón de repositorio con MongoDB.

0

El tipo y el nombre del miembro de identificación debe ser diferente de la siguiente manera

public ObjectId Id { get; set; } 

Dónde ObjectId está en el espacio de nombres MongoDB.Bson

2

Recuperar los datos de la MongoDB usando C# es bastante simple y hay tres diferentes formas en que los datos se pueden rodar hacia fuera para frontend

  1. Lista
  2. cursor
  3. LINQ

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

el código anterior muestra para recuperar los datos utilizando los cursores. Referrence

+0

Esto usa la nueva API. Genial, gracias. –

Cuestiones relacionadas