標籤:collect lin oca app 事先 維護 集中 geometry map
固定集合(適用於記錄日誌)
固定集合需要事先建立好,而且它的大小是固定的.當固定集合被佔滿時,如果再插入新文檔,固定集合會自動將最老的文檔從集合中刪除。
固定集合的文檔數量不能超過文檔數量限制,固定集合的大小也不能超過大小限制。已首先到達限制為準。
建立固定集合
db.createCollection(" my_collection", {" capped" : true, "size" : 100000,‘max‘:100});
capped :固定集合
my_collection :集合名詞
size : 集合大小
max :文檔數量
將普通集合轉換為固定集合
db.runCommand({" convertToCapped" : "test", "size" : 10000});
不能將固定集合轉換成普通集合
自然排序
對固定集合可以進行一種特殊的排序,稱為自然排序(naturalsort)。自然排序返回結果集中文檔的順序就是文檔在磁碟上的順序。
自然排序得到的文檔是從舊到新排列的。當然也可以按照從新到舊的順序排列
db.my_collection.find(). sort({" $ natural" : -1})
迴圈遊標
迴圈遊標(tailablecursor)是一種特殊的遊標,當迴圈遊標的結果集被取光後,遊標不會被關閉。迴圈遊標的靈感來自tail-f命令(迴圈遊標跟這個命令有點兒相似),會儘可能久地持續提取輸出結果。由於迴圈遊標在結果集取光之後不會被關閉,因此,當有新文檔插入到集合中時,迴圈遊標會繼續取到結果。由於普通集合并不維護文檔的插入順序,所以迴圈遊標只能用在固定集合上。
TTL索引-具有生命週期的索引
建立TTL索引
db.foo.ensureIndex({" lastUpdated" : 1}, {" expireAfterSecs" : 60* 60* 24})
這樣就在"lastUpdated"欄位上建立了一個TTL索引。如果一個文檔的"lastUpdated"欄位存在並且它的值是日期類型,當伺服器時間比文檔的"lastUpdated"欄位的時間晚expireAfterSecs秒時,文檔就會被刪除。
MongoDB每分鐘對TTL索引進行一次清理,所以不應該依賴以秒為單位的時間保證索引的存活狀態。可以使用collMod命令修改expireAfterSecs的值:
db.runCommand({" collMod" : "someapp.cache", "expireAfterSecs" : 3600})
TTL索引不能是複合索引,但是可以像“普通”索引一樣用來最佳化排序和查詢。
地理空間索引
2dsphere
允許使用GeoJSON格式指定點、線和多邊形。
點可以用形如[longitude,latitude]([經度,緯度])的兩個元素的數組表示:
{ "name" : "New York City", "loc" : { "type" : "Point", "coordinates" : [50, 2] } }
線可以用一個由點組成的數組來表示:
{ "name" : "Hudson River", "loc" : { "type" : "Line", "coordinates" : [[ 0,1], [0,2], [1,2]] } }
多邊形的表示方式與線一樣(都是一個由點組成的數組),但是"type"不同:
{ "name" : "New England", "loc" : { "type" : "Polygon", "coordinates" : [[ 0,1], [0,2], [1,2]] } }
建立索引
db.world.ensureIndex({" loc" : "2dsphere"})
交集查詢 $geoIntersects
var eastVillage = { ... "type" : "Polygon", ... "coordinates" : [ ... [-73.9917900, 40.7264100], ... [-73.9917900, 40.7321400], ... [-73.9829300, 40.7321400], ... [-73.9829300, 40.7264100] ... ]}
db.map.find({"loc" : {" $geoIntersects" : {"$geometry" : eastVillage}}})
包含查詢 $within
db.map.find({"loc" : {"$within" : {"$geometry" : eastVillage}}})
附近查詢 $near
db.map.find({"loc" : {" $near" : {" $geometry" : eastVillage}}})
2D索引
對於非球面地圖(遊戲地圖、時間連續的資料等)。只能對點進行索引。
資料類型[22,22]座標
建立索引
db.world.ensureIndex({" tile" : "2d"})
包含查詢 $near
db.world.find({" tile" : {" $ near" : [20, 21]}})
附近查詢 $within $box表示矩形
db.hyrule.find({" tile" : {" $ within" : {" $ box" : [[ 10, 20], [15, 30]]}}})
Mongodb 特殊索引和集合