MongoDB系列一(索引及C#如何操作MongoDB)

靜逸發表於2015-07-09

索引總概況

db.test.ensureIndex({"username":1})//建立索引
db.test.ensureIndex({"username":1, "age":-1})//建立複合索引  數字1表示username鍵的索引按升序儲存,-1表示age鍵的索引按照降序方式儲存。
// 該索引被建立後,基於username和age的查詢將會用到該索引,或者是基於username的查詢也會用到該索引,但是隻是基於age的查詢將不會用到該複合索引。因此可以說,如果想用到複合索引,必須在查詢條件中包含複合索引中的前N個索引列。然而如果查詢條件中的鍵值順序和複合索引中的建立順序不一致的話,MongoDB可以智慧的幫助我們調整該順序,以便使複合索引可以為查詢所用。
db.test.ensureIndex({"userid":1},{"unique":true})//建立唯一索引
db.test.ensureIndex({"userid":1,"age":1},{"unique":true})    // 我們同樣可以建立複合唯一索引,即保證複合鍵值唯一即可
db.test.ensureIndex({"username":1},{"background":true})//如果在為已有資料的文件建立索引時,可以執行下面的命令,以使MongoDB在後臺建立索引,這樣的建立時就不會阻塞其他操作。但是相比而言,以阻塞方式建立索引,會使整個建立過程效率更高,但是在建立時MongoDB將無法接收其他的操作。
db.test.ensureIndex({"userid":1},{"unique":true,"dropDups":true})    
//建立唯一索引,並消除重複資料。

db.test.getIndexes()//檢視索引 db.system.indexes.find()// system.indexes集合中包含了每個索引的詳細資訊,因此可以通過下面的命令查詢已經存在的索引

db.test.dropIndex({"username":1})//刪除索引

 

Explain方法簡介

explain是非常有用的工具,會幫助你獲得查詢方面諸多有用的資訊。只要對遊標呼叫該方法,就可以得到查詢細節。explain會返回一個文件,而不是遊標本身。explain會返回查詢使用的索引情況,耗時和掃描文件數的統計資訊。

db.test.find().explain()
    {
        "cursor" : "BasicCursor",
        "nscanned" : 1,
        "nscannedObjects" : 1,
        "n" : 1,
        "millis" : 0,
        "nYields" : 0,
        "nChunkSkips" : 0,
        "isMultiKey" : false,
        "indexOnly" : false,
        "indexBounds" : {

        }    
    }
  •  "cursor":"BasicCursor"表示沒有使用索引,查詢採用的是“表掃描”,也就是順序查詢。 ”BtreeCursor"採用B樹的結構來存放索引
  •   "nscanned":1 表示查詢了多少個文件。
  •   "n":1 表示返回的文件數量。
  •   "millis":0 表示整個查詢的耗時。

這裡特別說明一下哦,不要認為你把裡面的資料都刪除掉了索引也隨之沒有了,索引自從你建立之後就一直存在在那兒,除非你手工刪除,如果你確定是不需要的索引,請務必使用dropIndex方法將它手工刪除。

C#中使用MongoDB DLL驅動

 MongoDB.Driver.dll:顧名思義,驅動程式

 MongoDB.Bson.dll:序列化、Json相關

下載地址 http://files.cnblogs.com/files/liyunhua/MongoDBDll.zip

c#操作MongoDB簡單程式碼介紹

模型層程式碼如下:

    /// <summary>
    /// 使用者主要資料
    /// </summary>
    public class UserInfo
    {
        public string UserId { get; set; }
        public string UserName { get; set; }
        public string PassWord { get; set; }
        public Detail Detail { get; set; }
    }

    /// <summary>
    /// 使用者詳細資料
    /// </summary>
    public class Detail
    {
        public string Address { get; set; }
        public int Age { get; set; }
        public string Email { get; set; }
    }

UserBLL邏輯層中主要程式碼如下:

        public string connectionString = "mongodb://localhost";//連線字串
        public string databaseName = "myDatabase";//資料庫名

        private Mongo mongo;
        private MongoDatabase mongoDatabase;

        //注意這裡泛型型別為“UserInfo”
        private MongoCollection<UserInfo> mongoCollection;

        public UserBLL()
        {
            mongo = GetMongo();
            mongoDatabase = mongo.GetDatabase(databaseName) as MongoDatabase;//獲得資料庫
            mongoCollection = mongoDatabase.GetCollection<UserInfo>() as MongoCollection<UserInfo>;//獲得資料庫中集合
            mongo.Connect();//在建構函式中進行資料庫連線
        }
        ~UserBLL()
        {
            mongo.Disconnect();//在解構函式中進行關閉連線
        }

        /// <summary>
        /// 配置Mongo,將類UserInfo對映到集合
        /// </summary>
        private Mongo GetMongo()
        {
            var config = new MongoConfigurationBuilder();
            //進行對映
            config.Mapping(mapping =>
            {
                mapping.DefaultProfile(profile =>
                {
                    profile.SubClassesAre(t => t.IsSubclassOf(typeof(UserInfo)));
                });
                mapping.Map<UserInfo>();
            });
            config.ConnectionString(connectionString);
            return new Mongo(config.BuildConfiguration());
        }

插入、選擇、刪除資料方法如下(寫在UserBLL中)

        /// <summary>
        /// 查詢詳細資料地址為湖北的使用者資訊
        /// </summary>
        public List<UserInfo> Select()
        {
            return mongoCollection.Linq().Where(x => x.Detail.Address == "湖北").ToList();
        }

        /// <summary>
        /// 刪除全部使用者資訊
        /// </summary>
        public void DeleteAll()
        {
            mongoCollection.Remove(x => true);
        }
        /// <summary>
        /// 插入一些資料
        /// </summary>
        public void InsertSomeData()
        {
            UserInfo userInfo1 = new UserInfo()
            {
                UserId = "1001",
                UserName = "張三",
                PassWord = "123456"
            };
            mongoCollection.Save(userInfo1);

            UserInfo userInfo2 = new UserInfo()
            {
                UserId = "1002",
                UserName = "李四",
                PassWord = "123456",
                Detail = new Detail()
                {
                    Address = "湖北",
                    Age = 20,
                    Email = "lisi@163.com"
                }
            };
            mongoCollection.Save(userInfo2);

            UserInfo userInfo3 = new UserInfo()
            {
                UserId = "1003",
                UserName = "王五",
                PassWord = "123456",
                Detail = new Detail()
                {
                    Address = "廣東",
                    Age = 20,
                    Email = "wangwu@163.com"
                }
            };
            mongoCollection.Save(userInfo3);

            UserInfo userInfo4 = new UserInfo()
            {
                UserId = "1004",
                UserName = "趙六",
                PassWord = "123456",
                Detail = new Detail()
                {
                    Address = "湖北"
                }
            };
            mongoCollection.Save(userInfo4);

        }        

當然上述的查詢和刪除的方法寫成如下所示也是可以的

      /// <summary>
        /// 刪除全部使用者資訊
        /// </summary>
        public void DeleteAll()
        {
            mongoCollection.Remove(new Document { });
        }
     /// <summary>
        /// 插入一些資料
        /// </summary>
        public void InsertSomeData()
        {
            Document userInfo1 = new Document();
            userInfo1["UserId"] = "1001";
            userInfo1["UserName"] = "張三";
            userInfo1["PassWord"] = "123456";
            mongoCollection.Save(userInfo1);

            Document userInfo2 = new Document();
            userInfo2["UserId"] = "1002";
            userInfo2["UserName"] = "李四";
            userInfo2["PassWord"] = "123456";
            //子文件
            var userInfo2Detail = new Document();
            userInfo2Detail["Address"] = "湖北";
            userInfo2Detail["Age"] = 20;
            userInfo2Detail["Email"] = "lisi@163.com";
            userInfo2["Detail"] = userInfo2Detail;
            mongoCollection.Save(userInfo2);

            Document userInfo3 = new Document();
            userInfo3["UserId"] = "1003";
            userInfo3["UserName"] = "王五";
            userInfo3["PassWord"] = "123456";
            var userInfo3Detail = new Document();
            userInfo3Detail["Address"] = "廣東";
            userInfo3Detail["Age"] = 20;
            userInfo3Detail["Email"] = "wangwu@163.com";
            userInfo3["Detail"] = userInfo3Detail;
            mongoCollection.Save(userInfo3);

            Document userInfo4 = new Document();
            userInfo4["UserId"] = "1004";
            userInfo4["UserName"] = "趙六";
            userInfo4["PassWord"] = "123456";
            var userInfo4Detail = new Document();
            userInfo4Detail["Address"] = "湖北";
            userInfo4["Detail"] = userInfo4Detail;
            mongoCollection.Save(userInfo4);

        }

在控制檯main函式中的程式碼如下所示:

            UserBLL userBll = new UserBLL();
            userBll.InsertSomeData();
            var users = userBll.Select();
            foreach (var user in users)
            {
                Console.WriteLine(user.UserName + "是湖北人");
            };            
            userBll.DeleteAll();
            Console.ReadKey();

執行的效果如圖所示:

附加話外問題

今天同學問我一個問題,在我看來我覺得太簡單不過了,都懶得理會他,結果拿到手上來一試居然沒解決。不知道有誰看到我這篇文章的高手能給我一點建議!

言歸正傳,我同學需要限制文字框只能輸入中文,測試程式碼如下所示:

<input type="text" onchange="value = value.replace(/[^\u4E00-\u9FA5]/g, '') " />

結果就是在所有瀏覽器裡面都可以,唯獨谷歌不行,在谷歌中執行的效果就是隻能輸入第一次中文,後面的中文就全部輸入不進去了,搞了老半天,在群裡面也問過好些高手,都沒有給我一個最終方案。

最後我只能經一位高手的指引建議我同學採用http://www.mathachew.com/sandbox/jquery-autotab/

但是後來我同學覺得如果採用外掛的方式的話,第一不知道是否可行,第二改動太大。我後來也忙,最後不了了之了。

不知道在座的各位是否能夠幫忙解決一下。(心裡這個好奇呀)

 

相關文章