¿Puedo completar automáticamente los campos LastUpdated en MongoDB (usando el controlador C #)?

Quiero actualizar automáticamente un campo LastUpdatedOn en un documento mongo cada vez que ocurre una operación de guardar o actualizar en ese documento.

En lugar de poner esta carga en cada fragmento de código que guarda / actualiza, hay alguna forma de hacerlo automáticamente (estoy usando el controlador C #).

Por ejemplo, en nHibernate puede usar interceptores. ¿Existe una técnica similar disponible a nivel de base de datos o de controlador?

preguntado el 02 de febrero de 12 a las 11:02

2 Respuestas

interceptores. ¿Existe una técnica similar disponible a nivel de base de datos o de controlador?

No existe tal mecanismo en el controlador mongodb c # y tampoco en el mongodb. Para satisfacer sus necesidades, puede envolver todo Save, Insert, atómico Update métodos y set LastUpdatedOn campo allí.

Por ejemplo, puede tener una clase base para su repositorio, servicio, donde sea que envuelva sus métodos de Guardar:

public abstract class BaseMongoService<T> where T : BaseDocument
{
   protected abstract MongoCollection Items { get; }

   public virtual SafeModeResult Save(T document)
   {
      document.LastUpdatedOn = DateTime.Now;

      return Items.Save(document);
   }
   public virtual void Update(IMongoQuery query, IMongoUpdate update)
   {
      update = update.Set("LastUpdatedOn", DateTime.Now);
      Items.Update(query, update);
   }
}

entonces necesitarás heredar todos tus documentos de BaseDocument (o obligarlos a implementar alguna interfaz) para agregar la restricción de que todos los documentos deben contener el campo LastUpdatedOn.

public class BaseDocument
{
  public DateTime LastUpdatedOn {get;set;}
}

Luego, simplemente herede todas las clases de acceso a datos de la anterior y use los métodos Guardar, Actualizar de la clase base.

Nota:: todo este código no fue probado, es como veo que se puede hacer.

Respondido 02 Feb 12, 15:02

Puede completar los campos de fecha del lado del servidor (dentro de mongo) de la siguiente manera con Fecha actual:

public async Task UpdateAsync(YourDocument document)
{
  var updateOptions = new UpdateOptions
  {
    IsUpsert = true
  };

  var update = Builders<YourDocument>.Update
    .Set(c => c.Title, document.Title)
    .CurrentDate(c => c.LastUpdated);

  await Collection.UpdateOneAsync(c => c.Id == document.Id, update, updateOptions);
}
public record YourDocument
{
  [BsonId]
  [BsonRepresentation(BsonType.ObjectId)]
  public string Id { get; set; }

  public DateTime LastUpdated { get; set; }

  public string Title { get; set; }
}

Respondido 20 Jul 21, 10:07

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.