Пример #1
0
        /// <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());
        }
Пример #2
0
            /// <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));
            }
Пример #3
0
        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);
        }