/// <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; }
以上是删除日志数据方法。
场景:
日志生成功能,数据量很大,目前采取按时间创建数据库,每个月为一个新的数据库,代表当月的日志。例如: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()方法就不用说了,性能太低)
//使用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的