比較特別的索引使用[轉]


  • Lv 1

    ~ 索引陣列欄位 ~

    假設你有下列資料,但發現搜尋fans裡的值很慢,你想要建立索引,要著麼建呢?

    { "name" : "mark" , "fans" : ["steven","jack","mmark"]}
    { "name" : "steven" , "fans" : ["max","jack","mmark"]}
    { "name" : "jack" , "fans" : ["steven","hello","mmark"]}
    

    事實上就和之前幾篇建立索引一樣。

    db.user.ensureIndex({"fans":1})
    

    那我們在再假設資料如下。

    { "name" : "mark" , 
      "fans" : [ 
        {"name" : "a" , "age" :11},
        {"name" : "b" , "age" :10},
        {"name" : "c" , "age" :21},
      ]
    },
    { "name" : "steven" , 
      "fans" : [ 
        {"name" : "e" , "age" :10},
        {"name" : "f" , "age" :20},
        {"name" : "c" , "age" :21},
      ]
    }
    

    這時如果我們建立fans裡的name為索引,指令會如下。

    db.user.ensureIndex({"fans.name":1})
    

    通過以上的方法就可以很簡單的將陣列欄位建立索引,但要是有幾點要注意。

    • 陣列索引的代價比一般的索引高,因為它需要更新的更多。
    • 一個索引中的陣列只能有一個,這是為了避免索引爆炸性增長。

    根據第二個注意點,我們來解釋一下,假設你有一個索引為{ "a" : 1 , "b" : 1 } 那麼下表會列出他的合法與否。

    資料合法與否
    db.test.insert({ "a" : 1, "b" : 2 })OK
    db.test.insert({ "a" : [1,2,3] , "b" : 2 })OK
    db.test.insert({ "a" : [1,2,3] , "b" : [1,2,3]})NO

    因為如果an個元素,而bm個元素,那索引就會建立n * m個索引列表,會爆炸,所以才有這限制。

    ~ 索引子欄位 ~

    假設有下列資料。

    { "name" : "mark",
      "address" : {
         "city" : "taipei",
         "zip" : 100,
      }
    }
    

    如果我們需要在city這子欄位上建立索引,可下達該指令。

    db.user.ensureIndex({"address.city" : 1})
    
    注意,{"address" : 1}與 {"address.city" : 1}這兩種是不同的, 對主欄位建立索引,只能用下列指令,才能使用索引進行查詢。
    db.user.find({ "address" : { "city" : "taipei" , "zip" : 100 }})
    

    而無法使用如下的搜尋,除非索引為{"address.city" : 1}

    db.user.find( {"address.city" : "taipei" })
    

    ~ 全文索引 ~

    mongodb中有一種專門用來搜尋全文的索引,前面有一篇有說到可以用正規表達式來進行搜尋,但它的缺點就在於大型全文的速度會非常慢,而且無法處理語言的理解。

    以下有兩點要注意。

    • 創建全文索引的成本非常高,建議是在離線狀況下建立全文索引。
    • 目前不支援中文。

    本帖部分内容已隐藏,请登入并回覆,以查看隐藏内容!


  • 註冊用戶

    想看~快給我看~芝麻開門


  • Lv 1

    想看~快給我看~芝麻開門


登录后回复
 

与 萌阔论坛 的连接断开,我们正在尝试重连,请耐心等待