首页 新闻 会员 周边 捐助

.NET操作 MongoDb,如何物理删除数据?remove方法是不行的

0
悬赏园豆:15 [已解决问题] 解决于 2016-01-07 10:53
/// <summary>
/// 
/// </summary>
/// <param name="connectionString"></param>
/// <param name="databaseName"></param>
/// <param name="collectionName"></param>
/// <param name="query">条件查询。 调用示例:Query.Matches("Title", "感冒") 或者 Query.EQ("Title", "感冒") 或者Query.And(Query.Matches("Title", "感冒"),Query.EQ("Author", "yanc")) 等等</param>
/// <returns></returns>
public static WriteConcernResult DeleteAll(string connectionString, string databaseName, string collectionName, IMongoQuery query)
{

MongoServer server = MongoServer.Create(connectionString);
//获取数据库或者创建数据库(不存在的话)。
MongoDatabase database = server.GetDatabase(databaseName);

WriteConcernResult result;
using (server.RequestStart(database))//开始连接数据库。
{
MongoCollection<BsonDocument> myCollection = database.GetCollection<BsonDocument>(collectionName);
if (null == query)
{
result = myCollection.RemoveAll();
}
else
{
result = myCollection.Remove(query);
}
}
return result;
}
DeleteAll

以上是删除日志数据方法。

场景:

日志生成功能,数据量很大,目前采取按时间创建数据库,每个月为一个新的数据库,代表当月的日志。例如:T_RunLog_201512,T_RunLog_201511,,数据库名字。

实现功能:定时删除数据,跨月删除直接删除数据库,例如:删除11月份的:database.drop();

        public static bool DeleteDb(string connectionString, string databaseName)
        {
            MongoServer server = MongoServer.Create(connectionString);
            //获取数据库或者创建数据库(不存在的话)。
            MongoDatabase database = server.GetDatabase(databaseName);
            bool flag = true;
            try
            {
                database.Drop();
            }
            catch (Exception)
            {
                flag = false;
                throw;
            }
            return flag;
        }

问题:

删除一个月中几天的数据,不删除数据库,但MongoDb删除数据为逻辑删除,非物理删除,原来的日志文件还占用磁盘空间(妈的,10天就有20G的数据),怎么搞,

一句话表述我的问题:Mongodb如何物理删除一个集合中的数据,使得文件不占用磁盘空间(磁盘整理db.repairdatabase()方法就不用说了,性能太低)

Lasthelloworld的主页 Lasthelloworld | 初学一级 | 园豆:92
提问于:2015-12-15 18:17
< >
分享
最佳答案
0

//使用database.RunCommand命令 在驱动程序中运行命令

db.RunCommand(compact);//收回被删除的库空间


db.MontiorLog__RunLog.stats()

 

repairDatabase()


MontiorLog__RunLog

db.runCommand({ compact : 'Root' })
db.runCommand({ "compact" : "Root" })

 


comoact命令可以压缩单个集合和它的索引。以前压缩数据库的唯一办法就是执行这个数据库的repair!
这个命令类似与Oracle的去高水位线!
具体用法:
>use testdb
> db.myCollection.runCommand('compact');
> db.runCommand({ compact : 'myCollection' });
压缩比率截图:

 

压缩比率=348160/1044480*100%=33%

compact优点:
1.compact只压缩需要的Collection,压缩期间产生的临时文件会就相对较少,对磁盘剩余空间需求较小;

2.compact去除Collection所在文件的碎片,其重建索引的cost也变小了,对内存的需求也减少;

compact注意点:
1.compact操作是不会释放磁盘空间的,而是把释放的空间继续给MongoDB使用;
2.compact操作进行时会产生对应的锁,使用mongostat可以查看,所以该操作最好在业务量最少下进行;
3.限制集合{Capped Collection}是不需要compact的

Lasthelloworld | 初学一级 |园豆:92 | 2016-01-07 10:51
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册