索引是用來加速查詢的。
建立索引:
>db.person.ensureIndex({"name":1}) ------1表示升序,-1表示降序
一般一定要建立查詢中用到的所有鍵的索引,索引才會在查詢啟作用。
>db.person.find({"date":date1}).sort({"date":1,"name":1})
上述查詢必須進行表掃描,需要進行以下操作:
>db.person.ensureIndex({“date”:1,"name":1})
組合索引鍵的排列不同,建立的索引不同。
預設下索引名為:keyname1_dir1_keyname2_dir2_keyname3_dir3……這種形式,dir代表索引的方向1或者-1.可以給索引命名:
>db.person.ensureIndex({“date”:1,"name":1},{"name":"date_name")
explain()傳回查詢使用的索引情況,耗時及掃描文檔數的統計資訊。
索引建立是要花費很多時間的,可以使用{"background”:true}選項是建立過程在背景運作。
下圖顯示了索引建立前後的性能對比:
cursor: mongodb采用B樹的結構來存放索引,索引名為後面的“name_1"。
nscanned: 代表查找了多少個文檔。
n: 傳回文檔的數量
millis: 執行所需的時間
建立唯一索引
>db.person.ensureIndex({“date”:1,"name":1},{"unique":"true"})
insert不檢查文檔是否插入過了。
當為已有集合建立索引,有些文檔值已經重複了,則使用dropDups選項,保留第一個文檔。
>db.person.ensureIndex({“date”:1,"name":1},{"unique":"true","dropDups":true})
唯一複合索引:單個鍵值可以相同,但所有鍵值組合不同。
删除索引:dropIndexes
地理空間索引:找到離目前位置最近的N個場所,為坐标平面查詢建立索引
gps"鍵的值是一個包含兩個元素的數組或者兩個鍵的内嵌文檔,鍵名可以任意。預設情況下值的範圍:-180~180。可以指定最大最小值。
>db.map.ensureIndex({"gps":"2d"})
>db.map.ensureIndex({"gps":"2d"},{"min":-1000,"max":1000}
"{"gps":[0,100]}
{"gps":{”x":-30,"y":30})
{"gps":{"latitude":-180,"longitude":180}}
地理空間查詢
find():"$near":兩個目标值數組作為參數。
>db.map.find({"gps":{"$near":[40,-73]}})
按照離點(40,-73)由近及遠的方式将map集合的所有文檔都傳回。預設傳回100個文檔。
>db.map.find({"gps":{"$near":[40,-73]}}).limit(10)
以下操作同樣完成上述功能,還傳回每個文檔到查詢點的距離。
>db.runCommand({geoNear:"map",near:[40,-73],num:10});
還可以找指定形狀内的文檔:
>db.map.find({"gps":{"$within":{”$box":[[10,20],[15,30]]}}})
"$box":第一個參數指定左下角的坐标,第二個參數指定右上角的坐标
"$center":指定圓心和半徑:
>db.map.find({"gps":{"$within":{”$center":[[12,25],5]}}})
符合地理空間索引
>db.map.ensureIndex({"gps":"2d","desc":1})
查找最近的咖啡館:
>db.map.find({"gps":{"$near":[40,-73]},"desc":"coffeeshop"}).limit(1)
轉載于:https://www.cnblogs.com/lucyawei/archive/2013/04/28/3048967.html