我有一个由map reduce调用生成的集合,并且该键由两个字段组成,所以我的id设置如下:
{
"_id": {
"ts": ISODate("2014-04-22T13: 46: 00.0Z"),
"own": "LP2"
}
//... my fields
}
在“_id”上自动构建索引:
{
"v": NumberInt(1),
"key": {
"_id": NumberInt(1)
},
"ns": "DB.COLLECTION_NAME",
"name": "_id_"
}
但是当我查询时,我经常想要对“ts”字段进行排序。
我知道我可以构建一个索引,但我想知道“_id”上的索引是否已经支持它,就像复合索引一样。这可以节省插入时间。
提前感谢您的回答。
答案 0 :(得分:0)
我不相信它会。测试方法是插入一些测试数据并尝试一些测试查询。当我运行db.collectionname.find({}).sort({"_id.ts":-1}).explain()
时,很明显它没有使用索引进行排序:
{
"cursor" : "BasicCursor",
"isMultiKey" : false,
"n" : 13,
"nscannedObjects" : 13,
"nscanned" : 13,
"nscannedObjectsAllPlans" : 13,
"nscannedAllPlans" : 13,
"scanAndOrder" : true,
"indexOnly" : false,
"nYields" : 0,
"nChunkSkips" : 0,
"millis" : 0,
"server" : "local:27017",
"filterSet" : false
}
请注意,scanandorder为真。
添加新索引后,直接索引_id.ts我看到了更好的结果:
db.collectionname.ensureIndex({"_id.ts":1})
db.collectionname.find({}).sort({"_id.ts":-1}).explain()
{
"cursor" : "BtreeCursor _id.ts_1 reverse",
"isMultiKey" : false,
"n" : 13,
"nscannedObjects" : 13,
"nscanned" : 13,
"nscannedObjectsAllPlans" : 13,
"nscannedAllPlans" : 13,
"scanAndOrder" : false,
"indexOnly" : false,
"nYields" : 0,
"nChunkSkips" : 0,
"millis" : 0,
"indexBounds" : {
"_id.ts" : [
[
{
"$maxElement" : 1
},
{
"$minElement" : 1
}
]
]
},
"server" : "local:27017",
"filterSet" : false
}
请注意,scanandorder现在为false。