如何在MongoDB中的数组字段中创建索引?

时间:2015-03-22 23:07:40

标签: mongodb

我有一个 MongoDB 集合,其格式为:

[
   {
      "data1":1,
      "data2":2,
      "data3":3,
      "data4":4,
      "horses":[
         {
            "opponent":{
               "jockey":"MyFirstName MyLastName",
               "name":"MyHorseName",
               "age":4,
               "sex":"g",
               "scratched":"false",
               "id":"1"
            },
            "id":"1"
         },
         {
            "opponent":{
               "jockey":"YourFirstName YourLastName",
               "name":"YourHorseName",
               "age":4,
               "sex":"m",
               "scratched":"false",
               "id":"2"
            },
            "id":"2"
         }
      ]
   },
   ...
]

执行以下查询将完全返回我需要的内容:

db.race_results.find({ "$and": [ { "horses": 
                        { "$elemMatch": { "$and": [
                            { "opponent.name": "MyFirstName MyLastName" },
                            { "opponent.jockey": "MyHorseName"}
                            ] } }
                        }
                      ]})

然而,此查询需要 0.5秒才能执行我的收藏(有很多记录)。

我试图找出如何在数据的horses.opponent.name字段上创建索引。我已经阅读了有关多键索引的文档(here),但我不确定这是否正是我需要的。我需要(我认为)是horses的数组元素的索引,但只有namejockey字段。这可能吗?

有没有办法创建索引以使我的特定查询(上面的那个)更快?

任何指针都将非常感激。我是 MongoDB 的新手,但学得很快!

1 个答案:

答案 0 :(得分:0)

要创建的索引是:

db.race_results.ensureIndex({"horses.opponent.name":1, "horses.opponent.jockey":1})

创建此索引后,您的案例中的查询应返回的扫描对象数等于匹配对象的数量:

db.race_results.find( { horses: { $elemMatch: { "opponent.name": "MyHorseName", "opponent.jockey": "MyFirstName MyLastName" } } }
).explain()