2013-08-27 157 views
0

我對MongoDB稀疏索引有疑問。 我有一個集合(後)用很少的文檔(6K最大的),可以以這種方式嵌入子文檔:MongoDB稀疏索引和數組:太多索引的文檔

{ 
    "a": "a-val", 
    "b": "b-val", 
    "meta": { 
    "urls": [ "url1", "url2" ... ], 
    "field1": "value1", 
    ... 
    } 
} 

字段「A」和「B」總是呈現,而是「 meta.urls「可能不存在!現在

,我剛好插入一個文件與「meta.urls」的值,然後我做了

db.post.ensureIndex({"a": 1, "b": 1, "meta.urls": 1}, {sparse: true}); 

後統計給了我一個「奇怪」的結果:指數約爲97MB! 這怎麼可能?只有一個插入「meta.urls」的文檔,索引大小爲97MB?

所以,我想通過這種方式來創建唯一的「meta.urls」指數:

db.post.ensureIndex({"meta.urls": 1}, {sparse: true}); 

我那裏有1文檔現在「meta.urls_1」指數。 但如果我解釋這樣

db.post.find({"meta.urls": {$exists: true}}).hint("meta.urls_1").explain({verbose: true}); 

我還有一個「奇怪」的結果,一個簡單的查詢:

"n" : 1, 
"nscannedObjects" : 5, 
"nscanned" : 5, 

爲什麼蒙戈掃描文檔5,一個不只是一個索引?

如果我查詢「meta.urls」上的精確匹配,單個稀疏索引將正常工作。

例子: db.post.find({ 「meta.urls」: 「爲url1」})。提示( 「meta.old_slugs_1」)// 1文件

回答

0

關於第一個問題:你可以使用一個複合索引來搜索它索引的鍵的前綴。例如,如果您只搜索a或同時搜索ab,則會使用您的第一個索引。因此,sparse將只能對a爲空的文檔編制索引。

我沒有第二個問題的答案,但你應該嘗試更新MongoDB並再次嘗試 - 它的移動速度非常快,並且在過去幾個月中稀疏索引變得更好。