要從聊天室總結隨訪,這個問題實際上涉及到這是做所有〜500K的文件的掃描一個發現()查詢找到15:
db.tweet_data.find({
$or:
[
{ in_reply_to_screen_name: /^kunalnayyar$/i, handle: /^kaleycuoco$/i, id: { $gt: 0 } },
{ in_reply_to_screen_name: /^kaleycuoco$/i, handle: /^kunalnayyar$/i, id: { $gt: 0 } }
],
in_reply_to_status_id_str: { $ne: null }
}).explain()
{
"cursor" : "BtreeCursor id_1",
"nscanned" : 523248,
"nscannedObjects" : 523248,
"n" : 15,
"millis" : 23682,
"nYields" : 0,
"nChunkSkips" : 0,
"isMultiKey" : false,
"indexOnly" : false,
"indexBounds" : {
"id" : [
[
0,
1.7976931348623157e+308
]
]
}
}
此查詢使用case-insensitive regular expressions這將不會有效地使用索引(儘管在這種情況下實際上沒有定義一個索引)。
建議的方法:
創建用於搜索目的小寫handle_lc
和inreply_lc
字段
在那些添加compound index:
db.tweet.ensureIndex({handle_lc:1, inreply_lc:1})
化合物索引的順序允許有效查找的所有鳴叫或者通過handle
或通過精確匹配代替正則表達式(handle,in_reply_to
)
搜索:
db.tweet_data.find({ $or: [ { in_reply_to_screen_name:'kunalnayyar', handle:'kaleycuoco', id: { $gt: 0 } }, { in_reply_to_screen_name:'kaleycuoco', handle:'kunalnayyar', id: { $gt: 0 } } ], })
有用以包括與[.explain()](HTTP一個示例查詢://www.mongodb.org/display/DOCS/Explain)。 – Stennie 2012-07-28 15:10:34