在MongoDB中,哪个索引更有效?一个使用两个值查询数组,还是一个使用$or语句?

在MongoDB中,哪个索引更有效?一个使用两个值查询数组,还是一个使用$or语句?,mongodb,mongodb-query,Mongodb,Mongodb Query,假设我有一个如下所示的文档: { _id:ObjectId(“5260ca3a1606ed3e76bf3835”), 活动编号:“20131020\u NFL\u SF\u TEN”, 小组:{ 客场:“SF”, 家:“十” } } 我想查询任何以“SF”作为客队或主队的比赛。因此,我在一个索引上写了一个索引:“代码>团队。” 另一种选择: { _id:ObjectId(“5260ca3a1606ed3e76bf3835”), 活动编号:“20131020\u NFL\u SF\u TEN”,

假设我有一个如下所示的文档:

{
_id:ObjectId(“5260ca3a1606ed3e76bf3835”),
活动编号:“20131020\u NFL\u SF\u TEN”,
小组:{
客场:“SF”,
家:“十”
}
}
我想查询任何以“SF”作为客队或主队的比赛。因此,我在一个索引上写了一个索引:“代码>团队。” 另一种选择:

{
_id:ObjectId(“5260ca3a1606ed3e76bf3835”),
活动编号:“20131020\u NFL\u SF\u TEN”,
小组:[
{
名称:“SF”,
loc:“离开”
},
{
名称:“十”,
loc:“家”
}
]
}
在上面的数组中,我可以在
team.name
上放置一个索引,而不是像以前那样放置两个索引。然后我会查询
team.name
,查找任何里面有“SF”的游戏


哪种查询更有效?谢谢

我相信您会希望使用您在
team.name
上给出的第二个单一索引示例

使用
$或
运算符时,您需要了解一些特殊注意事项。从中引用(带有一些附加格式):

将索引用于
$或
查询时,请记住
$或
查询的每个子句都将并行执行。这些子句可以各自使用自己的索引

db.inventory.find({$or:[{price:1.99},{sale:true}]})

对于此查询,您将在price上创建一个索引:
db.inventory.ensureIndex({price:1}

还有另一个在售索引:
db.inventory.ensureIndex({sale:1})

而不是一个复合索引

考虑到您的第一个示例,为您不打算专门查询的字段编制索引没有多大意义。当您说您不介意SF
是在客场还是主场比赛时,您将始终在查询中同时包含
客场
主场
字段,因此使用两个索引,其中只需查询一个值-
SF


当你在考虑文档格式的时候,你应该总是考虑你的大多数问题。想想你经常计划的问题,并相应地建立你的文档。最好的办法是尽可能地处理80%的情况,而不是尝试这样做。lve所有可能性(可能导致整体性能下降)


看看第二个嵌套文档示例,正如您所说,您只需要使用一个索引(在服务器上节省宝贵的空间)

来自的一些更相关的引用(同样添加了格式):

此外,在查询中使用<代码> $或运算符时,在查询中使用<代码> SoTo()/Case>方法,<查询>将不使用<代码> $或字段的索引。< /强>考虑以下查询,将“<代码> SoTo())//>方法添加到上述查询:

db.inventory.find({$or:[{price:1.99},{sale:true}])。排序({item:1})

此修改后的查询不会使用
价格上的索引,也不会使用
销售上的索引

所以现在的问题是-您是否计划使用
sort()
函数?如果答案是肯定的,那么您应该意识到您的索引可能会变得毫无用处(


这是非常重要的“取决于它”。考虑你计划要做的查询,并根据你的使用预测考虑什么样的文档结构和索引会对<强> > <强>有利。