Mongodb索引基础
Mongodb的配置已经应用知识请参考上一篇Mongodb从配置到应用/// /// Mongodb索引 /// public class MongodbIndex { public void MongoIndexTest() { //创建Mongo连接 var mongo = new Mongo("mongodb://localhost"); mongo.Connect(); //获取一个数据库,如果没有会自动创建一个 var db = mongo.GetDatabase("movieReviews"); //创建一个列表,并为这个列表创建文档 var movies = db.GetCollection("movies"); //查询数据库全部数据 var alldata = movies.Find(new Document()); foreach (var item in alldata.Documents) { Console.WriteLine(item); } Console.WriteLine("-----------------------------------------------"); //默认索引 //mongoDB有个默认的“_id”的键,他相当于“主键”的角色。集合创建后系统会自动创建一个索引在“_id”键上,它是默认索引,索引名叫“_id_”,是无法被删除的。 var _idindex = movies.Metadata.Indexes.Single(s => s.Key == "_id_"); Console.WriteLine(_idindex); //单列索引, //在单个键上创建的索引就是单列索引,例如我们要在“UserInfo”集合上给“UserName”键创建一个单列索引,语法如下:(1表示正序,-1逆序) movies.Metadata.CreateIndex(new Document() { { "title", 1 } }, false); var _titleindex = movies.Metadata.Indexes.Single(s => s.Key == "_title_"); Console.WriteLine(_titleindex); //组合索引 //另外,我们还可以同时对多个键创建组合索引。如下代码创建了按照“UserId”正序,“UserName”逆序的组合索引: movies.Metadata.CreateIndex(new Document() { { "title", 1 }, { "num", 1 } }, false); var _zuheindex = movies.Metadata.Indexes.Single(s => s.Key == "_title_"); Console.WriteLine(_zuheindex); //子文档索引 //我们可以对文档类型的键创建各种索引,例如单列索引,如下创建用户详细信息“Detail”的单列索引: movies.Metadata.CreateIndex(new Document() { { "title", 1 } }, false); //对子文档的键创建组合索引:例如在“Detail.Address”和“Detail.Age”上创建组合索引: movies.Metadata.CreateIndex(new Document() { { "title.subtitle", 1 } }, false); //唯一索引 //唯一索引限制了对当前键添加值时,不能添加重复的信息。值得注意的是,当文档不存在指定键时,会被认为键值是“null”,所以“null”也会被认为是重复的,所以一般被作为唯一索引的键,最好都要有键值对。 //对“UserId”创建唯一索引(这时候最后一个参数为“true”): movies.Metadata.CreateIndex(new Document() { { "num", 1 } }, true); Console.WriteLine("----------------维护索引-------------------"); //维护索引, //查询索引 //下面提供一个遍历全部索引的方法,打印全部索引信息: foreach (var index in movies.Metadata.Indexes) { Console.WriteLine(index.Value); } //集合的索引也是通过一个集合来维护的。name表示索引名,ns表示索引属于哪个库哪个集合, //key表示索引在哪个键上,正序还是逆序,unique表示是否为唯一索引,等等... //删除索引 //关系型数据库中,表被删除了,索引也不会存在。在MongoDB中不存在删除集合的说法, //就算集合数据清空,索引都是还在的,要移除索引还需要手工删除 movies.Metadata.DropIndex("_title_"); } } Mongodb的索引:1 单列索引,2,组合索引。3,子文档索引。4,唯一索引。
测试索引:
public class TestMongodb { private Mongo mongo; private MongoDatabase mongoDatabase; private MongoCollection mongoCollection; public TestMongodb() { mongo = new Mongo("mongodb://localhost"); mongoDatabase = mongo.GetDatabase("TestMongoDB") as MongoDatabase; var table = mongoDatabase.GetCollection("tableMongo"); mongoCollection = mongoDatabase.GetCollection("tableMongo") as MongoCollection; mongo.Connect(); } ~TestMongodb() { mongo.Disconnect(); } //插入十万条数据 public void InsertMongo() { var random = new Random(); TimeSpan span = new TimeSpan(DateTime.Now.Ticks); for (int i = 0; i < 100000; i++) { Document doc = new Document(); doc["ID"] = i; doc["Data"] = "data" + random.Next(10000); mongoCollection.Save(doc); } TimeSpan span1 = new TimeSpan(DateTime.Now.Ticks); Console.WriteLine("当前有" + mongoCollection.FindAll().Documents.Count() + "条数据"); Console.WriteLine("程序执行了:" + span1.Subtract(span).Duration().Seconds); } //创建索引 public void CreateIndex() { mongoCollection.Metadata.CreateIndex(new Document() { { "Data", 1 } }, false); } //排序 public void SortForData() { mongoCollection.FindAll().Sort(new Document() { { "Data", 1 } }); } public void Start() { Stopwatch watch = new Stopwatch(); watch.Start(); SortForData(); Console.WriteLine("无索引排序时间:" + watch.Elapsed); CreateIndex(); Stopwatch watch1 = new Stopwatch(); watch1.Start(); SortForData(); Console.WriteLine("有索引排序时间:" + watch1.Elapsed); } }
页:
[1]