//private IMongoCollection<T> GetNowSnapCollection() //{ // return GetSnapCollection(DateTime.Now); //} public void Add(T model, DateTime?modelTime = null) { DateTime time = modelTime ?? DateTime.Now; model.CreatedOn = time; OriginalCollection.InsertOne(model, null, new CancellationToken()); foreach (var snapCollection in GetValidSnapCollectionAfter(time)) { snapCollection.InsertOne(model, null, new CancellationToken()); } }
public long Delete <TKey>(TKey key, DateTime?modelTime = null) { var filter = GetFilterDefinitionOfKey(key); var result = OriginalCollection.DeleteOne(filter); if (result.DeletedCount < 1) { return(0); } DateTime time = modelTime ?? DateTime.Now; var snapCollection = GetSnapCollection(time); var uresult = snapCollection.UpdateOne(filter, Builders <T> .Update.Set(x => x.Deleted, true).Set(x => x.DeletedTime, time)); return(uresult.ModifiedCount); }
public void AddOrEdit(T model, DateTime?modelTime = null) { DateTime time = modelTime ?? DateTime.Now; var filterDef = GetFilterDefinitionOfKey(model); var modelInDb = OriginalCollection.Find(filterDef).FirstOrDefault(); if (modelInDb == null) { Add(model, time); } else { Edit(model, modelInDb, time); } }
public void Edit(T model, DateTime?modelTime = null) { DateTime time = modelTime ?? DateTime.Now; var filterDef = GetFilterDefinitionOfKey(model); var modelInDb = OriginalCollection.Find(filterDef).FirstOrDefault(); if (modelInDb == null) { throw new Exception("can't find such record"); } else { Edit(model, modelInDb, time); } }
/// <summary> /// 从主表复制到 /// </summary> /// <param name="time"></param> /// <returns></returns> private bool CopyToSnap(IMongoCollection <T> snapCollection) { if (snapCollection.CountDocuments(x => true) > 0) { return(false); } lock (CopyLocker) { if (snapCollection.CountDocuments(x => true) > 0) { return(true);//被别的线程锁定之后再进入的。 } snapCollection.InsertMany( OriginalCollection.Find(x => !x.Deleted).ToEnumerable() ); } return(true); }
private bool Edit(T model, T modelInDb, DateTime modelTime) { var filterDef = GetFilterDefinitionOfKey(model); var listChange = ModelCompareHelper.Compare(model, modelInDb, modelTime); //下面更新主表字段 和 快照表的ChangeRecords UpdateDefinitionBuilder <T> builder = Builders <T> .Update; UpdateDefinition <T> update = null; update = builder.PushEach("ChangeRecords", listChange.Select(x => x.ToRecord())); foreach (var snapCollection in GetValidSnapCollectionAfter(modelTime)) { var modelInSnap = snapCollection.Find(filterDef).FirstOrDefault(); if (modelInSnap == null) { if (!CopyToSnap(snapCollection)) { throw new Exception("Database Error.");//这种情况一般是snap有了,但是没有当前数据。 我暂时也不知道如何处理。 } } var snapResult = snapCollection.UpdateOne(filterDef, update); } update = Builders <T> .Update.Set(x => x.ModifiedOn, modelTime); foreach (var change in listChange) { update = update.Set(change.FieldName, change.NewValue); } var result = OriginalCollection.UpdateOne(filterDef, update); if (result.ModifiedCount < 1) { throw new Exception("Error Happenned when Update Database"); } return(true); }
private T GetModelFromLast <TKey>(TKey key) { var model = OriginalCollection.Find(GetFilterDefinitionOfKey(key)).FirstOrDefault(); return(model); }