次のドキュメントを持つMongoDBにコレクションがあります。
/* 0 */
{
"T" : [
374135056604448742
],
"_id" : {
"#" : 7778532275691,
"ts" : ISODate("2013-07-26T02:25:00Z")
}
}
/* 1 */
{
"T" : [
1056188940167152853
],
"_id" : {
"#" : 34103385525388,
"ts" : ISODate("2013-07-30T03:00:00Z")
}
}
/* 2 */
{
"T" : [
1056188940167152853
],
"_id" : {
"#" : 34103385525388,
"ts" : ISODate("2013-07-30T03:18:00Z")
}
}
今、次のクエリでいくつかのドキュメントをクエリしようとしています。
db.entries.find({
'_id.ts': {'$gte': beginTS, '$lte': endTS},
'_id.#' : 884327843395156951
}).hint([('_id', 1)]).explain()
私の理解によると、_id は複合フィールドであり、Mongo は常に _id のインデックスを保持しているため、上記のクエリに答えるには、Mongo は「_id」のインデックスを使用する必要がありました。ただし、上記のクエリに対する回答は次のとおりです。
{u'allPlans': [{u'cursor': u'BtreeCursor _id_',
u'indexBounds': {u'_id': [[{u'$minElement': 1}, {u'$maxElement': 1}]]},
u'n': 2803,
u'nscanned': 4869528,
u'nscannedObjects': 4869528}],
u'cursor': u'BtreeCursor _id_',
u'indexBounds': {u'_id': [[{u'$minElement': 1}, {u'$maxElement': 1}]]},
u'indexOnly': False,
u'isMultiKey': False,
u'millis': 128415,
u'n': 2803,
u'nChunkSkips': 0,
u'nYields': 132,
u'nscanned': 4869528,
u'nscannedAllPlans': 4869528,
u'nscannedObjects': 4869528,
u'nscannedObjectsAllPlans': 4869528,
u'scanAndOrder': False,
ご覧のとおり、MongoDB は DB 全体をスキャンしてほんの一握りのドキュメントを見つけています。ここで一体何が間違っているのかわかりません。
クエリの順序を変更してみましたが、結果は同じでした。ここで何が起こっているのかわかりません。深く感謝します。
アップデート
ここでニュアンスが分かりました。_id は複合インデックスではなく、単なる正確なインデックスです。これは、_id がドキュメントの場合、ドキュメントの構造やネストされた属性またはサブドキュメントの数に関係なく、_id インデックスには _id フィールドのエントリが 1 つしか含まれないことを意味します。このエントリは _id ドキュメントのハッシュであると想定され、一意に維持されます。