/// <summary> /// 翻译Update部分的Lambda表达式。得到要更新的属性或字段。 /// </summary> /// <typeparam name="T">使用条件的类型参数。</typeparam> /// <param name="update">Update表达式。</param> /// <returns>翻译结果。</returns> private static BsonDocument TranslateUpdate <T>(Expression <Func <T> > update) where T : new() { if (update.NodeType != ExpressionType.Lambda) { throw new Exception("参数Update不是正确的Lambda表达式"); } var updatebody = update.Body as MemberInitExpression; var analysiser = new InitExpresPropAnalysiser(); var updatedPropList = analysiser.Analysiser(updatebody); var mongoUpdate = new MongoDB.Driver.Builders.UpdateBuilder(); foreach (var membVal in updatedPropList) { mongoUpdate.SetWrapped(membVal.MemberRoute, membVal.Value); } return(mongoUpdate.ToBsonDocument()); }
/// <summary> /// Returns an update builder used in the mongodb's update procedure; /// prepares a builder that sets some properties on insert and increases some other properties on update /// </summary> /// <returns></returns> public IMongoUpdate GetUpdateBuilder() { MongoDB.Driver.Builders.UpdateBuilder SetOnInsertBuilder = new MongoDB.Driver.Builders.UpdateBuilder(); MongoDB.Driver.Builders.UpdateBuilder IncBuilder = new MongoDB.Driver.Builders.UpdateBuilder(); //object's own props var props = this.GetType().GetProperties(); //build updates foreach (var p in props) { if (!PropsIncreasedOnUpdate.Contains(p.Name)) { //use dynamic here so it can be then converted to BsonValue by the mongodb driver dynamic pValue = p.GetValue(this); if (pValue == null) { SetOnInsertBuilder.SetOnInsert(p.Name, BsonNull.Value); } else { if (p.Name != "_id") //do not set id on insert, let db generate it! { SetOnInsertBuilder.SetOnInsert(p.Name, pValue); } } } else { IncBuilder.Inc(p.Name, p.GetValue(this) as dynamic); } } //output combined update builders return(MongoDB.Driver.Builders.Update.Combine(SetOnInsertBuilder, IncBuilder)); }
public static bool Update(string dbName, string collectionName, MongoDB.Driver.IMongoQuery query, MongoDB.Driver.Builders.UpdateBuilder update) { MongoCollection collection = GetCollection(dbName, collectionName); WriteConcernResult result = collection.Update(query, update); return(result.UpdatedExisting); }