我正在尝试为热门查询创建复合索引。
有两个字段。 String类型的'client'字段,包含IP地址。另一个是'sendOn'字段,其类型为Date。我正在寻找客户端为null且sendOn介于某个范围之间的文档。
为了支持sendOn字段的升序排序,我已经确定我需要一个值为1的sendOn索引。
所以,我跑了
> db.queries.ensureIndex({"client":1,"sendOn":1})
> db.queries.find({ $query: { client: { $exists: false } , sendOn: { $gt: new Date(1387664033883), $lt: new Date(1387750493883) } } }).explain()
{
"cursor" : "BasicCursor",
"nscanned" : 2546133,
"nscannedObjects" : 2546133,
"n" : 0,
"millis" : 25071,
"nYields" : 0,
"nChunkSkips" : 0,
"isMultiKey" : false,
"indexOnly" : false,
"indexBounds" : {
}
}
文档说$ exists查询通常效率低下。我已经考虑过强制文档至少包含一个空客户端字段。但该查询也不使用索引?
答案 0 :(得分:1)
它应该使用索引(如果您将null值替换为null值,如前所述 - $ exists运算符未针对索引进行优化)。
你可能在某些方面弄乱了一些东西:文档声明你不应该使用.explain()和$ query格式:
http://docs.mongodb.org/manual/reference/operator/meta/query/
试试这个:
db.queries.find({ $query: { client: null , sendOn: { $gt: new Date(1387664033883), $lt: new Date(1387750493883) } }, $explain: true });