Banner_Etool

MongoMapper.NET 1.0

Por: Emilio Torrens  /  En: , , , ,

imageCreo que esta versión se puede dar como “Production Ready” ya que esta usándose en varios Proyectos, en desarrollo, pre producción:

- Una gestión de membresía para una cadena hotelera de 15 hoteles, este proyecto esta en Pre Producción, a puntito de pasar a Producción.

- Una aplicación de gestión de textos/traducciones para un BackOffice de una CRS Hotelera que tiene parte ya en Producción.

- Una aplicación de venta online de traslados con cálculos dinámicos por Geo Localización, el API de este proyecto esta en Pre Producción.

Todas estas aplicaciones están corriendo en “mono” así que también se ha hecho un buen testeo de la compatibilidad.

Ya estamos trabajando en la 1.1, sobre todo revisando el performance Sonrisa

MongoMapper.NET: Querys con BsonDefaultValue y BsonIgnoreIfDefault

Por: Emilio Torrens  /  En: , , , ,

 

mongomapper_grandeHe subido a producción una nueva versión con cambios en la parte de filtros para poder usar la combinación de  atributos [BsonDefaultValue] y [BsonIgnoreIfDefault] para ahorrar espacio sin tener que programar nada extra.

MongoMapper.NET comprueba que propiedades de la clase tienen estos atributos y lo tiene en cuenta la hora de filtrar con EtoolTech.MongoDB.Mapper.MongoQuery.

Además también tiene en cuenta las Enumeraciones a la hora de filtrar, pudiéndole pasar –1 si queremos filtros tipo LIKE = ‘%’.

Con estos cambios, salvo bugs de ultima hora, daré por cerrada la versión 1.0 ya que se esta usando en 2 proyectos que están a puntito de ponerse en Producción y me están haciendo un buen testeo.

MongoMapper.NET

Por: Emilio Torrens  /  En: , , , ,

mongomapper_grandeAcabo de subir a la rama de producción los cambios de master

Lamentablemente he tenido que romper compatibilidad en algunas cosas.

-He cambiado todo el sistema de búsquedas,  he quitado el Finder y todos los métodos estáticos de la clase MongoMapper, a cambio he metido una clase nueva, MongoMapperCollection, que es la que se usara en las búsquedas:

var col = new MongoMapperCollection<Country>();
 
col.Find().SetLimit(1);     
Assert.AreEqual(1, col.Count);
Assert.AreEqual(3, col.Total);     
 
col.Find().SetLimit(3).SetSortOrder("Name");
Assert.AreEqual(3, col.Count);
Assert.AreEqual(3, col.Total);
 
col.Find(Query<Country>.EQ(C => C.Code, "NL"));
Assert.AreEqual("NL",col.First().Code);
Assert.AreEqual("NL", col.Last().Code);
 
foreach (Country country in col)
{}

También puedes heredar tu clase de MongoMapperCollection y usarla ya “Tipada”

public class CountryCollection: MongoMapperCollection<Country>
{}
 
var col = new CountryCollection();
 
col.Find().SetLimit(1);     
Assert.AreEqual(1, col.Count);
Assert.AreEqual(3, col.Total);     
 
col.Find().SetLimit(3).SetSortOrder("Name");
Assert.AreEqual(3, col.Count);
Assert.AreEqual(3, col.Total);
 
col.Find(Query<Country>.EQ(C => C.Code, "NL"));
Assert.AreEqual("NL",col.First().Code);
Assert.AreEqual("NL", col.Last().Code);
 
foreach (Country country in col)
{}

-La configuración también ha cambiado, como en cada versión están sacando cosas nuevas era inmantenible, la he cambiado para definir una Url con todas las configuraciones, ahora queda una cosa así:

<MongoMapperConfig>
    <Server Url="mongodb://127.0.0.1" />
    <Database Name="TestDotNET" />
    <Context Generated="true" MaxDocumentSize="8" ExceptionOnDuplicateKey="true" EnableOriginalObject="true"
             UseIncrementalId="true" UseChidlsIncrementalId="false" />
    <CollectionConfig>
      <add Name="TestConf1">
        <Server Url="mongodb://host1:27017,host2:27017,host3:1234/?readPreference=primaryPreferred;w=2" />
        <Database Name="Conf1" />
        <Context Generated="true" MaxDocumentSize="8" ExceptionOnDuplicateKey="true" EnableOriginalObject="true"
                 UseIncrementalId="false" UseChidlsIncrementalId="true" />
      </add>
      <add Name="Person">
        <Server Url="mongodb://127.0.0.1" />
        <Database Name="TestDotNETPerson" />
        <Context Generated="true" MaxDocumentSize="8" ExceptionOnDuplicateKey="true" EnableOriginalObject="true"
                 UseIncrementalId="true" UseChidlsIncrementalId="false" />
      </add>
    </CollectionConfig>
  </MongoMapperConfig>

- He cambiado el nombre al campo que controla la versión del Documento de MongoMapperDocumentVersion a m_dv y el MongoMapper_Id a m_id, el Id no pasa nada ya que internamente se guarda como _id,  pero el otro si, para colecciones con datos tendrás que usar el rename:

db.collection_name.update ( {}, { $rename : { "MongoMapperDocumentVersion" : "m_dv" }, false, true } );

Ademas necesita la versión >= 1.7 del Driver, ya que ellos también han hecho muchos cambios.

Otros cambios son:

  • Implementado ISupportInitialize para el tema de OriginalObject, ya no es necesario usar la versión modificada del Driver para esto
  • Posibilidad de susbcribise a eventos en el BeginInit y EndInit del ISupportInitialize, son OnObjectInit y OnObjectComplete
  • Añadida propiedad “ExtraElements” donde se recogerán los valores de los propiedades que no estén definidas en la clase.
  • Eliminado el <T> en todos los métodos no estáticos de la clase base, ahora queda mejor el código.
  • Eliminados todos los métodos de búsqueda que recibían una expresión, como expone la colección se puede usar el LINQ del Driver.
  • Update a la versión 1.7 del Driver, MongoClient, WriteConcern y todos esos cambios.

Esta versión esta ahora en master y en Producción.

https://github.com/emiliotorrens/MongoMapper.NET

Cualquier cosa email me o fork.

Nueva versión de MongoMapper.NET

Por: Emilio Torrens  /  En: , , , ,

ico_mongomapperAcabo de subir a master una nueva versión con algunos cambios,  detallare un poco sobre los cambios mas importantes, el resto se auto describen o son trasparentes, de todas formas en el proyecto de test hay ejemplos de todo.

-Exponer Colección.
-Exponer Aggregation Framework.
-Eliminado Fsync de la configuración y añadido Journal.
-Borrar en el lado del servidor.
-Leer de primario siempre en el FindAndModify del IdGenerator secuencial.
-Transacciones en Memoria.
-Posibilidad de subscribirse a un evento en el Current del Enumerador de MongoCursor del Driver.
-OriginalObject en Cursores.
-Versión del Documento.
-Versión del Documento FillFromLastVersion.
-Versión del Documento IsLastVersion.

- Transacciones en Memoria:

Ira acumulando los cambios en una cola pero si ejecutara las validaciones y los eventos, solo escribirá en la base de datos en el commit o descartara cambios (vaciara la cola) en rollback, ojo es transacción en memoria, una vez iniciado el commit si hay algún fallo en el lado del servidor eso no es transaccional.

Puedes ver ejemplos aquí.

- Posibilidad de subscribirse a un evento en el Current del Enumerador de MongoCursor del Driver:

Esta modificación ha sido necesaria para poder usar el OriginalObject con cursores, para que funcione tienes que usar una versión modificada del Driver, la que esta en la carpeta de Dependencies, o puedes descargarla de aquí.

MongoMapper sigue funcionando con la versión sin modificar del driver, lo único que no se puede usar el OriginalObject ni la subscripción al evento, lo demás funciona normalmente.

Puedes ver ejemplos aquí.

- Versión del Documento:

Hay un campo interno (MongoMapperDocumentVersion) de tipo Long que se va incrementando cada vez que se modifica un documento, esto nos sirve para comprobar si tenemos la ultima versión del documento cuando estamos trabajando con Replica Sets.

Los métodos son:

IsLastVersion: Devuelve si MongoMapperDocumentVersion es igual al MongoMapperDocumentVersion del mismo Documento en el servidor Primario, si no trabajamos con Replica Sets siempre true, lo podemos forzar.

FillFromLastVersion: Recarga el documento con el del servidor primario, si no trabajamos con Replica Sets no hace nada, lo podemos forzar.

Puedes ver ejemplos aquí.

La rama de master permanecerá una temporada estable ya que voy a empezar a hacer un serie de modificaciones que me llevaran un tiempo.

https://github.com/emiliotorrens/MongoMapper.NET

Actualizado MongoMapper.NET al Driver 1.5

Por: Emilio Torrens  /  En: , , ,

 

mongodb-post-150x150He subido una nueva versión de MongoMapper.NET con los cambios necesarios para que funcione con la ultima versión del Driver de C#.

El cambio principal es que ya no hace su propia serializacion usando el Driver, el driver ha cambiado la clase de serializacion a interna, en realidad eso solo lo usaba para guardar el objeto con los datos originales para el tema de GetOriginalObject o GetOriginalValue, ahora lo guardo en el momento de devolverlo en los Find.

2 cosas a tener en cuenta sobre el OriginalObject.

  • Si vas a usar el tema de OriginalObject tus clases tienen que estar marcadas con [Serializable] ya que he quitado la referencia de ServiceStack y hace serializacion binaria.
  • No funciona el OriginalObject cuando pides cursores en vez de listas.

Hay múltiples cambios en todo el sistema de Querys ya que el driver también ha sufrido cambios en eso, pero son transparentes, además he aprovechado para revisar y refactorizar todo el código.

https://github.com/emiliotorrens/MongoMapper.NET

Cualquier cosa email me o fork.