Estoy utilizando Diccionario. Después de .insert() hay "_t" y "_v". Dos publicaciones aquí hablaron sobre la conversión de serialización a JSON primero y luego a BSON . Estoy usando el controlador de MongoDB v2.4.3,
mCollection.InsertOne(x); IMongoCollection<myDoc> mCollection = Db.GetCollection<myDoc>("whatever");
Si hago JSON-a-BSON, se queja de que no puedo convertir BsonDocument a myDoc. Cambiando a IMongoCollection<BsonDocument> mCollection = Db.GetCollection<BsonDocument>("whatever");
todavía obtengo _t y _v.
¿Cómo evitar _t y _v?
Aquí está mi código de tipo de datos y utilización:
public class myObjForDictionary { //... } public class myDoc { // ... some other elements, then Dictionary public Dictionary<string, object> myDictionary { get; set; } } // to instantiate the class myClass { // define MongoDB connection, etc. // instantiate myDoc and populate data var x = new myDoc { //... myDictionary = new Dictionary<string, object> { { "type", "something" }, { "Vendor", new object[0] }, { "obj1", //data for myObjForDictionary } }; } }
Creo que está buscando DictionarySerializationOption ... que le brinda un par de opciones diferentes listas para usar para determinar cómo se serializa su diccionario.
Deberá guardar cierta información ( _t
) de qué objeto debe crear el deserializador al deserializar el objeto; de lo contrario, no sabrá qué crear desde el BSON.
Alternativamente, puede cambiar Dictionary<string, object>
a Dictionary<string, BsonDocument>
y manejar los BsonDocument
s directamente dentro de su código. Esto será muy similar a cómo usa JObject
dentro de Newtonsoft.Json
.
También sucede cuando el modelo pasado a mongo no es exactamente el tipo definido en el modelo.
En este caso, mongo agregará _t
ya que identifica que espera leer el tipo de clase del heredero y no el tipo definido en el modelo.
Por ejemplo:
public class ParentClass { } public class ChildClass : ParentClass { } public class ModelToInsert { public ParentClass property { get; set; } } ... // ChildClass is passed instead of ParentClass collection.InsertOne(new ModelToInsert { property = new ChildClass() });