MongoDB索引多输入搜索
我有一个如下所示的搜索功能: 此搜索中的条件作为条件对象传递给MongoDB索引多输入搜索,mongodb,database-design,mongodb-indexes,database,Mongodb,Database Design,Mongodb Indexes,Database,我有一个如下所示的搜索功能: 此搜索中的条件作为条件对象传递给MongoDB的find()方法,例如: { designer: "Designer1". store: "Store1", category: "Category1", name: "Keyword", gender: "Mens", price: {$gte: 50} } 我只是在MongoDB中学习索引,请耐心听我说。我知道我可以在每个字段上创建索引,也可以在几个字
MongoDB
的find()
方法,例如:
{
designer: "Designer1".
store: "Store1",
category: "Category1",
name: "Keyword",
gender: "Mens",
price: {$gte: 50}
}
我只是在MongoDB
中学习索引
,请耐心听我说。我知道我可以在每个字段上创建索引,也可以在几个字段上创建多索引。例如,对于一个索引,我可以做:
db.products.ensureIndex({designer: 1, store: 1, category: 1, name: 1, gender: 1, price: 1})
如果有人搜索(比如)一个类别,而不是一个设计师或商店,那么就会出现一个明显的问题,因为它不会被索引
我目前正在使用$和
运算符查找这些术语,因此我的问题是:
我如何创建一个允许这种类型的搜索的索引?我是否必须为这6个术语的每个可能组合创建索引?或者,如果我在搜索中使用
$和
,对每个词进行索引就足够了,我会获得最佳性能吗?$和
不起作用,因为MongoDB目前只能对每个查询使用一个索引。因此,如果在搜索的每个字段上创建索引,MongoDB将为该查询模式选择最合适的索引。您可以尝试使用explain()
查看选择了哪一个
为每个可能的组合创建索引可能不是一个好主意,因为您需要6*5*4*3*2*1
索引,即720
索引。。。您只能有63个索引。你也许可以选择最有可能的,但这不会有多大帮助
一种解决方案是以不同的方式存储数据,如:
{
properties: [
{ key: 'designer', value: "Designer1" },
{ key: 'store', value: "Store1" },
{ key: 'category', value: "Category1" },
{ key: 'name', value: "Keyword" },
{ key: 'gender', value: "Mens" },
{ key: 'price', value: 70 },
]
}
然后,您可以在以下各项上创建一个索引:
db.so.ensureIndex( { 'properties.key': 1, 'properties.value': 1 } );
搜索是否像:
db.so.find( { $and: [
{ properties: { $elemMatch: { key: 'designer', value: 'Designer1' } } },
{ properties: { $elemMatch: { key: 'price', value: { $gte: 30 } } } }
] } )
db.so.find( { $and: [
{ properties: { $elemMatch: { key: 'price', value: { $gte: 45 } } } }
] } )
在这两种情况下,都会使用索引,但现在仅用于
$和元素的第一部分。因此,请检查哪种键类型的值最多,并在查询中相应地对$和元素排序。当我在“什么”上运行它时,解释了什么@AjayGeorge是的,但是在哪个查找上?我想问的是,当有多个搜索字段时,哪个系统是最好的。是否要我为每个字段编制索引,然后在$和搜索中执行解释
。单个字段上的索引(带$and)与复合索引