我有一个包含 3 个数字属性的复合 _id:
_id": { "KeyA": 0, "KeyBOARD": 0, "Key": 0 }
相关数据库的 KeyA 有 200 万个相同值,KeyB 有 50 万个相同值的集群。
我的理解是,我可以使用以下命令有效地查询 KeyA 和 KeyB:
find( { "_id.KeyA" : 1, "_id.KeyB": 3 } ).limit(100)
当我解释这个查询时,结果是:
"cursor" : "BasicCursor",
"nscanned" : 1000100,
"nscannedObjects" : 1000100,
"n" : 100,
"millis" : 1592,
"nYields" : 0,
"nChunkSkips" : 0,
"isMultiKey" : false,
"indexOnly" : false,
"indexBounds" : {}
如果没有 limit(),结果是:
"cursor" : "BasicCursor",
"nscanned" : 2000000,
"nscannedObjects" : 2000000,
"n" : 500000,
"millis" : 3181,
"nYields" : 0,
"nChunkSkips" : 0,
"isMultiKey" : false,
"indexOnly" : false,
"indexBounds" : {}
据我了解,BasicCursor 意味着索引已被忽略,并且两个查询的执行时间都很长 - 即使我只请求 100 条记录,也需要大约 1.5 秒。我本来打算使用限制来实现分页,但这显然太慢了。
命令:
find( { "_id.KeyA" : 1, "_id.KeyB": 3, , "_id.KeyC": 1000 } )
正确使用 BtreeCursor 并快速执行,表明复合 _id 是正确的。
我正在使用 MongoDb 版本 1.8.3。有人可以澄清我是否看到了预期的行为或者我是否误解了如何使用/查询复合索引?
谢谢,
保罗.