我有一个 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
的数组元素的索引,但只有name
和jockey
字段。这可能吗?
有没有办法创建索引以使我的特定查询(上面的那个)更快?
任何指针都将非常感激。我是 MongoDB 的新手,但学得很快!
答案 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()