Banner_Etool

MongoMapper.NET 1.1

Por: Emilio Torrens  /  En: , , , ,

Antes de irme de vacaciones dejo publicado un nuevo reléase de MongoMapper.NET, hay muchos cambios pequeños, ninguno de rotura, esta es la lista de los mas “importantes”:

La configuración en base de datos quizás sea el cambio mas útil, ya que donde antes había tropecientas líneas de XML de configuración ahora puedes dejarlo en una key en el appSettings:

<add key=”MongoMapperDbConfig” value=”mongodb://127.0.0.1|TestDotNET|MongoMapperConfig|1″/>

Y le indicamos la cadena de conexión, la base de datos, la colección y la Key del documento con la configuración, puedes ver como funciona en el GetConfig de MongoMapperConfiguration.

El Documento tiene que ser el siguiente:

MongoMapper_db_config

Como siempre espero vuestros comentarios Sonrisa

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