mongoDB中多字段对象的索引

时间:2014-04-22 14:31:37

标签: mongodb

我有一个由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”上的索引是否已经支持它,就像复合索引一样。这可以节省插入时间。

提前感谢您的回答。

1 个答案:

答案 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。