2016-11-14 60 views
0

我在使用自定義對象作爲我在MongoDb中的_id值時遇到了一些問題。在MongoDb中使用對象作爲_id導致查詢上的collscan

我存儲在_id的物體看起來是這樣的:

"_id" : { 
    "EDIEL" : "1010101010101", 
    "StartDateTicks" : NumberLong(636081120000000000) 
} 

現在,當我執行以下查詢:

.find({ 
     "_id.EDIEL": { $eq: "1010101010101" }, 
     "_id.StartDateTicks": { $gte: 636082776000000000, $lt: 636108696000000000 } 
}).explain() 

我做了COLLSCAN。我無法弄清楚爲什麼。是否因爲我沒有對_id對象對象查詢?

有沒有人知道我在做什麼錯在這裏? :-)

編輯:

試圖創建包含EDIELStartDateTicks字段的化合物指數,再次運行查詢,現在,它使用索引,而不是一個列掃描。雖然這有效,但避免使用額外的索引並僅僅使用_id(因爲它基本上是一個「免費」索引)仍然很好。所以,問題仍然存在:爲什麼我不能查詢_id.EDIEL_id.StartDateTicks並使使用索引?

+0

你的問題是什麼導致COLLSCAN?你懷疑是在自定義_ID?如果是的話,那麼你猜測它是錯誤的,因爲你調用了.explain()方法,該方法又執行COLLSCAN。請參閱https://docs.mongodb.com/v3.2/reference/explain-results/ –

+0

您需要分別對兩個字段進行索引,因爲索引不能在嵌入式文檔中。 – hyades

+0

謝謝@hyades,這正是我需要的答案:-)如果你作出回答,我會接受它。 –

回答

0

索引用於鍵而不是對象,所以當您使用_id對象時,對象上的索引不能用於您在對象字段上執行的特定查詢。

這不僅適用於_id,也適用於子文檔。

{ 
"name":"awesome book", 
"detail" :{ 
    "pages":375, 
    "alias" : "AB" 
} 
} 

現在,當你有詳細的索引,而由detail.pages或detail.alias查詢,在細節上的索引不能使用,當然也不範圍查詢。你需要在detail.pages和detail.alias上有索引。

索引應用於對象時,它維護對象整體而非每個字段的索引,這就是爲什麼對象字段上的查詢無法使用對象索引的原因。

希望幫助

0

您將需要指數這兩個領域分開,因爲索引不能是嵌入式的文件。因此,創建複合索引是唯一可用的選項,或者在字段上創建多個索引,然後使用交集索引是您的選項。