/// <summary>
 /// 根据config获得MongoClientSettings,同时更新一些运行时变量
 /// </summary>
 /// <param name="config"></param>
 /// <returns></returns>
 public static MongoClientSettings CreateMongoClientSettingsByConfig(ref ConfigHelper.MongoConnectionConfig config)
 {
     //修改获得数据实例的方法
     MongoClientSettings mongoClientSetting = new MongoClientSettings();
     if (String.IsNullOrEmpty(config.ConnectionString))
     {
         mongoClientSetting.ConnectionMode = ConnectionMode.Direct;
         SetReadPreferenceWriteConcern(mongoClientSetting, config);
         //Replset时候可以不用设置吗?
         mongoClientSetting.Server = new MongoServerAddress(config.Host, config.Port);
         //MapReduce的时候将消耗大量时间。不过这里需要平衡一下,太长容易造成并发问题
         //From Driver 1.4 Pay attention to this comment
         //The default value for SocketTimeout has been changed from 30 seconds to 0,
         //which is a special value meaning to use the operating system default value,
         //which in turn is infinity. If you actually want a SocketTimeout you now have to set it yourself.
         //The SocketTimeout is currently a server level setting, but most likely in a future release it will be possible to set it at other levels,
         //including for individual operations.
         if (config.socketTimeoutMS != 0)
         {
             mongoClientSetting.SocketTimeout = new TimeSpan(0, 0, (int)(config.socketTimeoutMS / 1000));
         }
         if (config.connectTimeoutMS != 0)
         {
             mongoClientSetting.ConnectTimeout = new TimeSpan(0, 0, (int)(config.connectTimeoutMS / 1000));
         }
         if (config.wtimeoutMS != 0)
         {
             mongoClientSetting.WaitQueueTimeout = new TimeSpan(0, 0, (int)(config.wtimeoutMS / 1000));
         }
         if (config.WaitQueueSize != 0)
         {
             mongoClientSetting.WaitQueueSize = config.WaitQueueSize;
         }
         //运行时LoginAsAdmin的设定
         config.LoginAsAdmin = (config.DataBaseName == String.Empty);
         if (!(String.IsNullOrEmpty(config.UserName) || String.IsNullOrEmpty(config.Password)))
         {
             //认证的设定:注意,这里的密码是明文
             //
         }
         if (config.ReplSetName != String.Empty)
         {
             mongoClientSetting.ReplicaSetName = config.ReplSetName;
             config.ServerRole = ConfigHelper.SvrRoleType.ReplsetSvr;
         }
         else
         {
             config.ServerRole = ConfigHelper.SvrRoleType.DataSvr;
         }
         if (config.ServerRole == ConfigHelper.SvrRoleType.ReplsetSvr)
         {
             //ReplsetName不是固有属性,可以设置,不过必须保持与配置文件的一致
             mongoClientSetting.ConnectionMode = ConnectionMode.ReplicaSet;
             //添加Replset服务器,注意,这里可能需要事先初始化副本
             List<MongoServerAddress> ReplsetSvrList = new List<MongoServerAddress>();
             foreach (String item in config.ReplsetList)
             {
                 //如果这里的服务器在启动的时候没有--Replset参数,将会出错,当然作为单体的服务器,启动是没有任何问题的
                 MongoServerAddress ReplSrv;
                 if (item.Split(":".ToCharArray()).Length == 2)
                 {
                     ReplSrv = new MongoServerAddress(
                                     item.Split(":".ToCharArray())[0],
                                     Convert.ToInt16(item.Split(":".ToCharArray())[1]));
                 }
                 else
                 {
                     ReplSrv = new MongoServerAddress(item);
                 }
                 ReplsetSvrList.Add(ReplSrv);
             }
             mongoClientSetting.Servers = ReplsetSvrList;
         }
     }
     else
     {
         //使用MongoConnectionString建立连接
         mongoClientSetting = MongoClientSettings.FromUrl(MongoUrl.Create(config.ConnectionString));
     }
     //为了避免出现无法读取数据库结构的问题,将读权限都设置为Preferred
     if (mongoClientSetting.ReadPreference == ReadPreference.Primary)
     {
         mongoClientSetting.ReadPreference = ReadPreference.PrimaryPreferred;
     }
     if (mongoClientSetting.ReadPreference == ReadPreference.Secondary)
     {
         mongoClientSetting.ReadPreference = ReadPreference.SecondaryPreferred;
     }
     return mongoClientSetting;
 }
 /// <summary>
 /// 获取实例节点
 /// </summary>
 /// <param name="mongoConnKey"></param>
 /// <param name="config">由于是结构体,必须ref</param>
 /// <param name="mongoConn"></param>
 /// <param name="mMasterServerInstace"></param>
 /// <param name="mServer"></param>
 /// <param name="UserList"></param>
 /// <returns></returns>
 private static TreeNode GetInstanceNode(String mongoConnKey,
                                         ref ConfigHelper.MongoConnectionConfig config,
                                         MongoServer mongoConn,
                                         MongoServerInstance mMasterServerInstace,
                                         MongoServer mServer,
                                         EachDatabaseUser UserList)
 {
     Boolean isReplsetMasterServer = false;
     //无论如何,都改为主要服务器读优先
     if (mMasterServerInstace == null)
     {
         isReplsetMasterServer = true;
     }
     TreeNode SvrInstanceNode = new TreeNode();
     String ConnSvrKey;
     if (isReplsetMasterServer)
     {
         ConnSvrKey = mongoConnKey + "/" + mongoConnKey;
     }
     else
     {
         ConnSvrKey = mongoConnKey + "/" + mMasterServerInstace.Address.ToString().Replace(":", "@");
     }
     SvrInstanceNode.SelectedImageIndex = (int)GetSystemIcon.MainTreeImageType.WebServer;
     SvrInstanceNode.ImageIndex = (int)GetSystemIcon.MainTreeImageType.WebServer;
     if (isReplsetMasterServer)
     {
         SvrInstanceNode.Text = "Connection";
     }
     else
     {
         SvrInstanceNode.Text = "Server[" + mMasterServerInstace.Address.ToString() + "]";
     }
     if ((!String.IsNullOrEmpty(config.UserName)) & (!String.IsNullOrEmpty(config.Password)))
     {
         //是否是认证模式,应该取决于服务器!
         config.AuthMode = true;
     }
     //获取ReadOnly
     config.IsReadOnly = false;
     List<String> databaseNameList = new List<String>();
     if (!String.IsNullOrEmpty(config.DataBaseName))
     {
         //单数据库模式
         TreeNode mongoSingleDBNode;
         if (isReplsetMasterServer)
         {
             mongoSingleDBNode = FillDataBaseInfoToTreeNode(config.DataBaseName, mServer, mongoConnKey + "/" + mongoConnKey);
         }
         else
         {
             mongoSingleDBNode = FillDataBaseInfoToTreeNode(config.DataBaseName, mServer, mongoConnKey + "/" + mMasterServerInstace.Address.ToString());
         }
         mongoSingleDBNode.Tag = SINGLE_DATABASE_TAG + ":" + ConnSvrKey + "/" + config.DataBaseName;
         mongoSingleDBNode.SelectedImageIndex = (int)GetSystemIcon.MainTreeImageType.Database;
         mongoSingleDBNode.ImageIndex = (int)GetSystemIcon.MainTreeImageType.Database;
         SvrInstanceNode.Nodes.Add(mongoSingleDBNode);
         SvrInstanceNode.Tag = SINGLE_DB_SERVER_TAG + ":" + ConnSvrKey;
         ///获取User信息
         if (config.AuthMode)
         {
             try
             {
                 ///尝试添加用户信息
                 UserList.AddUser(mongoConn.GetDatabase(config.DataBaseName), config.UserName);
             }
             catch (Exception)
             {
                 //可能出现没有权限的问题,这里就认为无法取得权限
             }
         }
     }
     else
     {
         MongoServer InstantSrv;
         if (isReplsetMasterServer)
         {
             InstantSrv = mServer;
             databaseNameList = mServer.GetDatabaseNames().ToList<String>();
         }
         else
         {
             MongoClientSettings setting = CreateMongoClientSettingsByConfig(ref config);
             setting.ConnectionMode = ConnectionMode.Direct;
             //When Replset Case,Application need to read admin DB information
             //if Primary,there will be exception
             setting.ReadPreference = ReadPreference.PrimaryPreferred;
             setting.Server = mMasterServerInstace.Address;
             InstantSrv = new MongoClient(setting).GetServer();
             databaseNameList = InstantSrv.GetDatabaseNames().ToList<String>();
         }
         foreach (String strDBName in databaseNameList)
         {
             TreeNode mongoDBNode;
             try
             {
                 mongoDBNode = FillDataBaseInfoToTreeNode(strDBName, InstantSrv, ConnSvrKey);
                 mongoDBNode.ImageIndex = (int)GetSystemIcon.MainTreeImageType.Database;
                 mongoDBNode.SelectedImageIndex = (int)GetSystemIcon.MainTreeImageType.Database;
                 SvrInstanceNode.Nodes.Add(mongoDBNode);
                 if (config.AuthMode)
                 {
                     try
                     {
                         ///尝试添加用户信息
                         UserList.AddUser(mongoConn.GetDatabase(strDBName), config.UserName);
                     }
                     catch (Exception)
                     {
                         //可能出现没有权限的问题,这里就认为无法取得权限
                     }
                 }
             }
             catch (Exception ex)
             {
                 SystemManager.ExceptionDeal(ex, strDBName + "Exception", strDBName + "Exception");
                 mongoDBNode = new TreeNode(strDBName + " (Exception)");
                 mongoDBNode.ImageIndex = (int)GetSystemIcon.MainTreeImageType.Database;
                 mongoDBNode.SelectedImageIndex = (int)GetSystemIcon.MainTreeImageType.Database;
                 SvrInstanceNode.Nodes.Add(mongoDBNode);
             }
         }
         if (isReplsetMasterServer)
         {
             SvrInstanceNode.Tag = SERVER_TAG + ":" + mongoConnKey + "/" + mongoConnKey;
         }
         else
         {
             if (mongoConn.ReplicaSetName != null)
             {
                 SvrInstanceNode.Tag = SERVER_REPLSET_MEMBER_TAG + ":" + mongoConnKey + "/" + mMasterServerInstace.Address.ToString().Replace(":", "@");
             }
         }
     }
     if (_mongoInstanceLst.ContainsKey(ConnSvrKey))
     {
         _mongoInstanceLst.Remove(ConnSvrKey);
     }
     if (!isReplsetMasterServer)
     {
         _mongoInstanceLst.Add(ConnSvrKey, mMasterServerInstace);
     }
     return SvrInstanceNode;
 }
 /// <summary>
 /// 使用字符串连接来填充
 /// </summary>
 /// <remarks>http://www.mongodb.org/display/DOCS/Connections</remarks>
 /// <param name="connectionString"></param>
 /// <param name="config"></param>
 public static String FillConfigWithConnectionString(ref ConfigHelper.MongoConnectionConfig config)
 {
     String connectionString = config.ConnectionString;
     //mongodb://[username:password@]host1[:port1][,host2[:port2],...[,hostN[:portN]]][/[database][?options]]
     try
     {
         MongoUrl mongourl = MongoUrl.Create(connectionString);
         config.DataBaseName = mongourl.DatabaseName;
         if (mongourl.Username != null)
         {
             config.UserName = mongourl.Username;
             config.Password = mongourl.Password;
             //config.LoginAsAdmin = mongourl.Admin;
         }
         config.Host = mongourl.Server.Host;
         config.Port = mongourl.Server.Port;
         config.ReadPreference = mongourl.ReadPreference.ToString();
         //config.ReadPreference = ReadPreference.PrimaryPreferred.ToString();
         //TODO: Is this OK??
         config.WriteConcern = mongourl.GetWriteConcern(true).ToString();
         config.socketTimeoutMS = (int)mongourl.SocketTimeout.TotalMilliseconds;
         config.connectTimeoutMS = (int)mongourl.ConnectTimeout.TotalMilliseconds;
         config.wtimeoutMS = (int)mongourl.WaitQueueTimeout.TotalMilliseconds;
         config.WaitQueueSize = (int)mongourl.WaitQueueSize;
         config.ReplSetName = mongourl.ReplicaSetName;
         foreach (var item in mongourl.Servers)
         {
             config.ReplsetList.Add(item.Host + (item.Port == 0 ? String.Empty : ":" + item.Port.ToString()));
         }
         return String.Empty;
     }
     catch (FormatException ex)
     {
         return ex.ToString();
     }
     catch (Exception ex)
     {
         return ex.ToString();
     }
 }
        /// <summary>
        /// Set ReadPreference And WriteConcern 
        /// </summary>
        /// <param name="mongoSvrSetting"></param>
        /// <param name="config"></param>
        private static void SetReadPreferenceWriteConcern(MongoClientSettings mongoSvrSetting, ConfigHelper.MongoConnectionConfig config)
        {
            //----------------------------------------------
            //            New MongoClient class and default WriteConcern
            //----------------------------------------------

            //The new default WriteConcern is Acknowledged, but we have introduced the new
            //default in a way that doesn't alter the behavior of existing programs. We
            //are introducing a new root class called MongoClient that defaults the
            //WriteConcern to Acknowledged. The existing MongoServer Create methods are
            //deprecated but when used continue to default to a WriteConcern of Unacknowledged.

            //In prior releases you would start using the C# driver with code like this:

            //    var connectionString = "mongodb://localhost";
            //    var server = MongoServer.Create(connectionString); // deprecated
            //    var database = server.GetDatabase("test"); // WriteConcern defaulted to Unacknowledged

            //The new way to start using the C# driver is:

            //    var connectionString = "mongodb://localhost";
            //    var client = new MongoClient(connectionString);
            //    var server = client.GetServer();
            //    var database = server.GetDatabase("test"); // WriteConcern defaulted to Acknowledged

            //If you use the old way to start using the driver the default WriteConcern will
            //be Unacknowledged, but if you use the new way (using MongoClient) the default
            //WriteConcern will be Acknowledged.

            //当一个服务器作为从属服务器,副本组中的备用服务器,这里一定要设置为SlaveOK,默认情况下是不可以读取的
            //SlaveOK 过时,使用ReadPreference
            if (config.ReadPreference == ReadPreference.Primary.ToString())
            {
                mongoSvrSetting.ReadPreference = ReadPreference.Primary;
            }
            if (config.ReadPreference == ReadPreference.PrimaryPreferred.ToString())
            {
                mongoSvrSetting.ReadPreference = ReadPreference.PrimaryPreferred;
            }
            if (config.ReadPreference == ReadPreference.Secondary.ToString())
            {
                mongoSvrSetting.ReadPreference = ReadPreference.Secondary;
            }
            if (config.ReadPreference == ReadPreference.SecondaryPreferred.ToString())
            {
                mongoSvrSetting.ReadPreference = ReadPreference.SecondaryPreferred;
            }
            if (config.ReadPreference == ReadPreference.Nearest.ToString())
            {
                mongoSvrSetting.ReadPreference = ReadPreference.Nearest;
            }
            //Default ReadPreference is Primary
            //安全模式
            if (config.WriteConcern == WriteConcern.Unacknowledged.ToString())
            {
                mongoSvrSetting.WriteConcern = WriteConcern.Unacknowledged;
            }
            if (config.WriteConcern == WriteConcern.Acknowledged.ToString())
            {
                mongoSvrSetting.WriteConcern = WriteConcern.Acknowledged;
            }
            if (config.WriteConcern == WriteConcern.W2.ToString())
            {
                mongoSvrSetting.WriteConcern = WriteConcern.W2;
            }
            if (config.WriteConcern == WriteConcern.W3.ToString())
            {
                mongoSvrSetting.WriteConcern = WriteConcern.W3;
            }
            if (config.WriteConcern == WriteConcern.W4.ToString())
            {
                mongoSvrSetting.WriteConcern = WriteConcern.W4;
            }
            if (config.WriteConcern == WriteConcern.WMajority.ToString())
            {
                mongoSvrSetting.WriteConcern = WriteConcern.WMajority;
            }
            //Default WriteConcern is w=0
        }
 /// <summary>
 /// 
 /// </summary>
 /// <param name="mongoConnKey"></param>
 /// <param name="config"></param>
 /// <param name="mongoConn"></param>
 /// <param name="mServerInstace"></param>
 /// <param name="mServer"></param>
 /// <returns></returns>
 private static TreeNode GetInstanceNode(String mongoConnKey, ConfigHelper.MongoConnectionConfig config,
                                         MongoServer mongoConn, MongoServerInstance mServerInstace, MongoServer mServer)
 {
     Boolean isServer = false;
     if (mServerInstace == null)
     {
         isServer = true;
     }
     TreeNode SvrInstanceNode = new TreeNode();
     String ConnSvrKey;
     if (isServer)
     {
         ConnSvrKey = mongoConnKey + "/" + mongoConnKey;
     }
     else
     {
         ConnSvrKey = mongoConnKey + "/" + mServerInstace.Address.ToString().Replace(":", "@");
     }
     SvrInstanceNode.SelectedImageIndex = (int)GetSystemIcon.MainTreeImageType.WebServer;
     SvrInstanceNode.ImageIndex = (int)GetSystemIcon.MainTreeImageType.WebServer;
     if (isServer)
     {
         SvrInstanceNode.Text = "Connection";
     }
     else
     {
         SvrInstanceNode.Text = "Server[" + mServerInstace.Address.ToString() + "]";
     }
     if ((!String.IsNullOrEmpty(config.UserName)) & (!String.IsNullOrEmpty(config.Password)))
     {
         config.AuthMode = true;
     }
     //获取ReadOnly
     config.IsReadOnly = false;
     List<String> databaseNameList = new List<String>();
     if (!String.IsNullOrEmpty(config.DataBaseName))
     {
         //单数据库模式
         TreeNode mongoSingleDBNode;
         if (isServer)
         {
             mongoSingleDBNode = FillDataBaseInfoToTreeNode(config.DataBaseName, mServer, mongoConnKey + "/" + mongoConnKey);
         }
         else
         {
             mongoSingleDBNode = FillDataBaseInfoToTreeNode(config.DataBaseName, mServerInstace.Server, mongoConnKey + "/" + mServerInstace.Address.ToString());
         }
         mongoSingleDBNode.Tag = SINGLE_DATABASE_TAG + ":" + ConnSvrKey + "/" + config.DataBaseName;
         mongoSingleDBNode.SelectedImageIndex = (int)GetSystemIcon.MainTreeImageType.Database;
         mongoSingleDBNode.ImageIndex = (int)GetSystemIcon.MainTreeImageType.Database;
         SvrInstanceNode.Nodes.Add(mongoSingleDBNode);
         SvrInstanceNode.Tag = SINGLE_DB_SERVER_TAG + ":" + ConnSvrKey;
         if (config.AuthMode)
         {
             config.IsReadOnly = mongoConn.GetDatabase(config.DataBaseName).FindUser(config.UserName).IsReadOnly;
         }
     }
     else
     {
         MongoServer InstantSrv;
         if (isServer)
         {
             InstantSrv = mServer;
             databaseNameList = mServer.GetDatabaseNames().ToList<String>();
         }
         else
         {
             MongoServerSettings setting = mongoConn.Settings.Clone();
             setting.ConnectionMode = ConnectionMode.Direct;
             //When Replset Case,Application need to read admin DB information
             //if Primary,there will be exception
             setting.ReadPreference = ReadPreference.PrimaryPreferred;
             setting.Server = mServerInstace.Address;
             InstantSrv = new MongoServer(setting);
             databaseNameList = InstantSrv.GetDatabaseNames().ToList<String>();
         }
         foreach (String strDBName in databaseNameList)
         {
             TreeNode mongoDBNode;
             try
             {
                 mongoDBNode = FillDataBaseInfoToTreeNode(strDBName, InstantSrv, ConnSvrKey);
                 mongoDBNode.ImageIndex = (int)GetSystemIcon.MainTreeImageType.Database;
                 mongoDBNode.SelectedImageIndex = (int)GetSystemIcon.MainTreeImageType.Database;
                 SvrInstanceNode.Nodes.Add(mongoDBNode);
                 if (strDBName == MongoDBHelper.DATABASE_NAME_ADMIN)
                 {
                     if (config.AuthMode)
                     {
                         config.IsReadOnly = mongoConn.GetDatabase(strDBName).FindUser(config.UserName).IsReadOnly;
                     }
                 }
             }
             catch (Exception ex)
             {
                 MyMessageBox.ShowMessage(strDBName + "Exception", strDBName + "Exception", ex.ToString());
                 mongoDBNode = new TreeNode(strDBName + " (Exception)");
                 mongoDBNode.ImageIndex = (int)GetSystemIcon.MainTreeImageType.Database;
                 mongoDBNode.SelectedImageIndex = (int)GetSystemIcon.MainTreeImageType.Database;
                 SvrInstanceNode.Nodes.Add(mongoDBNode);
             }
         }
         if (isServer)
         {
             SvrInstanceNode.Tag = SERVER_TAG + ":" + mongoConnKey + "/" + mongoConnKey;
         }
         else
         {
             if (mongoConn.ReplicaSetName != null)
             {
                 SvrInstanceNode.Tag = SERVER_REPLSET_MEMBER_TAG + ":" + mongoConnKey + "/" + mServerInstace.Address.ToString().Replace(":", "@");
             }
         }
     }
     if (_mongoInstanceLst.ContainsKey(ConnSvrKey))
     {
         _mongoInstanceLst.Remove(ConnSvrKey);
     }
     if (!isServer)
     {
         _mongoInstanceLst.Add(ConnSvrKey, mServerInstace);
     }
     return SvrInstanceNode;
 }
 public static MongoServer CreateMongoServer(ref ConfigHelper.MongoConnectionConfig config)
 {
     MongoClient masterMongoClient = new MongoClient(CreateMongoClientSettingsByConfig(ref config));
     return masterMongoClient.GetServer();
 }
 public frmReplsetMgr(ref ConfigHelper.MongoConnectionConfig config)
 {
     InitializeComponent();
     _config = config;
 }
 /// <summary>
 /// 使用字符串连接来填充
 /// </summary>
 /// <remarks>http://www.mongodb.org/display/DOCS/Connections</remarks>
 /// <param name="connectionString"></param>
 /// <param name="config"></param>
 public static String FillConfigWithConnectionString(ref ConfigHelper.MongoConnectionConfig config)
 {
     String connectionString = config.ConnectionString;
     //mongodb://[username:password@]host1[:port1][,host2[:port2],...[,hostN[:portN]]][/[database][?options]]
     try
     {
         MongoUrl mongourl = MongoUrl.Create(connectionString);
         config.DataBaseName = mongourl.DatabaseName;
         if (mongourl.DefaultCredentials != null)
         {
             config.UserName = mongourl.DefaultCredentials.Username;
             config.Password = mongourl.DefaultCredentials.Password;
             config.LoginAsAdmin = mongourl.DefaultCredentials.Admin;
         }
         config.Host = mongourl.Server.Host;
         config.Port = mongourl.Server.Port;
         config.IsSlaveOk = mongourl.SlaveOk;
         config.IsSafeMode = mongourl.SafeMode.Enabled;
         config.socketTimeoutMS = (int)mongourl.SocketTimeout.TotalMilliseconds;
         config.connectTimeoutMS = (int)mongourl.ConnectTimeout.TotalMilliseconds;
         config.wtimeoutMS = (int)mongourl.WaitQueueTimeout.TotalMilliseconds;
         config.WaitQueueSize = (int)mongourl.WaitQueueSize;
         config.ReplSetName = mongourl.ReplicaSetName;
         foreach (var item in mongourl.Servers)
         {
             config.ReplsetList.Add(item.Host + (item.Port == 0 ? String.Empty : ":" + item.Port.ToString()));
         }
         return String.Empty;
     }
     catch (FormatException ex)
     {
         return ex.ToString();
     }
     catch (Exception ex)
     {
         return ex.ToString();
     }
 }
 /// <summary>
 /// 使用字符串连接来填充
 /// </summary>
 /// <remarks>http://www.mongodb.org/display/DOCS/Connections</remarks>
 /// <param name="connectionString"></param>
 /// <param name="config"></param>
 public static Boolean FillConfigWithConnectionString(ref ConfigHelper.MongoConnectionConfig config)
 {
     String connectionString = config.ConnectionString;
     //mongodb://[username:password@]host1[:port1][,host2[:port2],...[,hostN[:portN]]][/[database][?options]]
     try
     {
         MongoUrl mongourl = MongoUrl.Create(connectionString);
         config.DataBaseName = mongourl.DatabaseName;
         if (mongourl.DefaultCredentials != null)
         {
             config.UserName = mongourl.DefaultCredentials.Username;
             config.Password = mongourl.DefaultCredentials.Password;
             config.LoginAsAdmin = mongourl.DefaultCredentials.Admin;
         }
         config.Host = mongourl.Server.Host;
         config.Port = mongourl.Server.Port;
         config.IsSlaveOk = mongourl.SlaveOk;
         config.IsSafeMode = mongourl.SafeMode.Enabled;
         config.ReplSetName = mongourl.ReplicaSetName;
         config.SocketTimeOut = (int)mongourl.SocketTimeout.TotalSeconds;
         return true;
     }
     catch (FormatException)
     {
         return false;
     }
 }
 /// <summary>
 ///     根据config获得MongoClientSettings,同时更新一些运行时变量
 /// </summary>
 /// <param name="config"></param>
 /// <returns></returns>
 public static MongoClientSettings CreateMongoClientSettingsByConfig(
     ref ConfigHelper.MongoConnectionConfig config)
 {
     //修改获得数据实例的方法
     var mongoClientSetting = new MongoClientSettings();
     if (String.IsNullOrEmpty(config.ConnectionString))
     {
         mongoClientSetting.ConnectionMode = ConnectionMode.Direct;
         SetReadPreferenceWriteConcern(mongoClientSetting, config);
         //Replset时候可以不用设置吗?                    
         mongoClientSetting.Server = new MongoServerAddress(config.Host, config.Port);
         //MapReduce的时候将消耗大量时间。不过这里需要平衡一下,太长容易造成并发问题
         //The default value for SocketTimeout has been changed from 30 seconds to 0, 
         if (config.socketTimeoutMS != 0)
         {
             mongoClientSetting.SocketTimeout = new TimeSpan(0, 0, (int) (config.socketTimeoutMS/1000));
         }
         if (config.connectTimeoutMS != 0)
         {
             mongoClientSetting.ConnectTimeout = new TimeSpan(0, 0, (int) (config.connectTimeoutMS/1000));
         }
         if (SystemManager.ConfigHelperInstance.wtimeoutMS != 0)
         {
             mongoClientSetting.WaitQueueTimeout = new TimeSpan(0, 0, (int)(SystemManager.ConfigHelperInstance.wtimeoutMS / 1000));
         }
         if (SystemManager.ConfigHelperInstance.WaitQueueSize != 0)
         {
             mongoClientSetting.WaitQueueSize = SystemManager.ConfigHelperInstance.WaitQueueSize;
         }
         //运行时LoginAsAdmin的设定
         config.LoginAsAdmin = (config.DataBaseName == String.Empty);
         if (!(String.IsNullOrEmpty(config.UserName) || String.IsNullOrEmpty(config.Password)))
         {
             //认证的设定:注意,这里的密码是明文
             if (string.IsNullOrEmpty(config.DataBaseName))
             {
                 mongoClientSetting.Credentials = new[]
                 {
                     MongoCredential.CreateMongoCRCredential(DATABASE_NAME_ADMIN, config.UserName,
                         config.Password)
                 };
             }
             else
             {
                 mongoClientSetting.Credentials = new[]
                 {
                     MongoCredential.CreateMongoCRCredential(config.DataBaseName, config.UserName,
                         config.Password)
                 };
             }
         }
         if (config.ReplSetName != String.Empty)
         {
             mongoClientSetting.ReplicaSetName = config.ReplSetName;
             config.ServerRole = ConfigHelper.SvrRoleType.ReplsetSvr;
         }
         else
         {
             config.ServerRole = ConfigHelper.SvrRoleType.DataSvr;
         }
         if (config.ServerRole == ConfigHelper.SvrRoleType.ReplsetSvr)
         {
             //ReplsetName不是固有属性,可以设置,不过必须保持与配置文件的一致
             mongoClientSetting.ConnectionMode = ConnectionMode.ReplicaSet;
             //添加Replset服务器,注意,这里可能需要事先初始化副本
             var ReplsetSvrList = new List<MongoServerAddress>();
             foreach (String item in config.ReplsetList)
             {
                 //如果这里的服务器在启动的时候没有--Replset参数,将会出错,当然作为单体的服务器,启动是没有任何问题的
                 MongoServerAddress ReplSrv;
                 if (item.Split(":".ToCharArray()).Length == 2)
                 {
                     ReplSrv = new MongoServerAddress(
                         item.Split(":".ToCharArray())[0],
                         Convert.ToInt16(item.Split(":".ToCharArray())[1]));
                 }
                 else
                 {
                     ReplSrv = new MongoServerAddress(item);
                 }
                 ReplsetSvrList.Add(ReplSrv);
             }
             mongoClientSetting.Servers = ReplsetSvrList;
         }
     }
     else
     {
         //使用MongoConnectionString建立连接
         mongoClientSetting = MongoClientSettings.FromUrl(MongoUrl.Create(config.ConnectionString));
     }
     //为了避免出现无法读取数据库结构的问题,将读权限都设置为Preferred
     if (mongoClientSetting.ReadPreference == ReadPreference.Primary)
     {
         mongoClientSetting.ReadPreference = ReadPreference.PrimaryPreferred;
     }
     if (mongoClientSetting.ReadPreference == ReadPreference.Secondary)
     {
         mongoClientSetting.ReadPreference = ReadPreference.SecondaryPreferred;
     }
     return mongoClientSetting;
 }
 /// <summary>
 ///     Set ReadPreference And WriteConcern
 /// </summary>
 /// <param name="mongoSvrSetting"></param>
 /// <param name="config"></param>
 private static void SetReadPreferenceWriteConcern(MongoClientSettings mongoSvrSetting,
     ConfigHelper.MongoConnectionConfig config)
 {
     if (config.ReadPreference == ReadPreference.Primary.ToString())
     {
         mongoSvrSetting.ReadPreference = ReadPreference.Primary;
     }
     if (config.ReadPreference == ReadPreference.PrimaryPreferred.ToString())
     {
         mongoSvrSetting.ReadPreference = ReadPreference.PrimaryPreferred;
     }
     if (config.ReadPreference == ReadPreference.Secondary.ToString())
     {
         mongoSvrSetting.ReadPreference = ReadPreference.Secondary;
     }
     if (config.ReadPreference == ReadPreference.SecondaryPreferred.ToString())
     {
         mongoSvrSetting.ReadPreference = ReadPreference.SecondaryPreferred;
     }
     if (config.ReadPreference == ReadPreference.Nearest.ToString())
     {
         mongoSvrSetting.ReadPreference = ReadPreference.Nearest;
     }
     //Default ReadPreference is Primary
     //安全模式
     if (config.WriteConcern == WriteConcern.Unacknowledged.ToString())
     {
         mongoSvrSetting.WriteConcern = WriteConcern.Unacknowledged;
     }
     if (config.WriteConcern == WriteConcern.Acknowledged.ToString())
     {
         mongoSvrSetting.WriteConcern = WriteConcern.Acknowledged;
     }
     if (config.WriteConcern == WriteConcern.W2.ToString())
     {
         mongoSvrSetting.WriteConcern = WriteConcern.W2;
     }
     if (config.WriteConcern == WriteConcern.W3.ToString())
     {
         mongoSvrSetting.WriteConcern = WriteConcern.W3;
     }
     if (config.WriteConcern == WriteConcern.W4.ToString())
     {
         mongoSvrSetting.WriteConcern = WriteConcern.W4;
     }
     if (config.WriteConcern == WriteConcern.WMajority.ToString())
     {
         mongoSvrSetting.WriteConcern = WriteConcern.WMajority;
     }
     //Default WriteConcern is w=0
 }