public static Task <T> GetAsync <T>(this IMongoCollection <T> collection, Expression <Func <T, bool> > filter, UpdateDefinition <T> factory) where T : Entity => collection.FindOneAndUpdateAsync(filter, factory.SetOnInsert(x => x.Timestamp, DateTimeOffset.UtcNow), new FindOneAndUpdateOptions <T, T> { IsUpsert = true, ReturnDocument = ReturnDocument.After });
protected virtual UpdateDefinition <T> ToUpdateDefinition(Updates <T> updates) { UpdateDefinition <T> updateDefinition = Builders <T> .Update.Combine(); if (updates.Sets != null) { foreach (Update <T> update in updates.Sets) { updateDefinition = updateDefinition.Set(update.PropertyExpression, update.Value); } } if (updates.Increments != null) { foreach (Update <T> update in updates.Increments) { updateDefinition = updateDefinition.Inc(update.PropertyExpression, update.Value); } } if (updates.SetOnInserts != null) { foreach (Update <T> update in updates.SetOnInserts) { updateDefinition = updateDefinition.SetOnInsert(update.PropertyExpression, update.Value); } } if (updates.Pushes != null) { foreach (UpdateCollection <T> update in updates.Pushes) { var property = new ExpressionFieldDefinition <T>(update.PropertyExpression); updateDefinition = updateDefinition.Push(property, update.Value); } } if (updates.Pulls != null) { foreach (UpdateCollection <T> update in updates.Pulls) { var property = new ExpressionFieldDefinition <T>(update.PropertyExpression); updateDefinition = updateDefinition.Pull(property, update.Value); } } return(updateDefinition); }
public static UpdateDefinition <TDocument> SetOnInsertAllMappedMembers <TDocument>( this UpdateDefinition <TDocument> update, TDocument item , params Expression <Func <TDocument, object> >[] excludeMembers) { excludeMembers = excludeMembers ?? new Expression <Func <TDocument, object> > [0]; List <string> excludeMemberNames = excludeMembers.Select(p => GetMemberName(p)).ToList(); Type itemType = typeof(TDocument); List <PropertyInfo> mappedMembers = GetMappedMembers(itemType); foreach (PropertyInfo prop in mappedMembers) { if (excludeMemberNames.Contains(prop.Name)) { continue; } object value = prop.GetValue(item); update = update.SetOnInsert(prop.Name, value); } return(update); }
public bool Upsert(FilterDefinition <T> filter, UpdateDefinition <T> update) { return(Update(filter, update.SetOnInsert(i => i.CreatedOn, DateTime.Now), updateOptions: new UpdateOptions { IsUpsert = true })); }