我有一个搜索功能,如下所示:
此搜索的条件作为标准对象传递给MongoDB
的{{1}}方法,例如:
find()
我只是在{
designer: "Designer1".
store: "Store1",
category: "Category1",
name: "Keyword",
gender: "Mens",
price: {$gte: 50}
}
了解indexes
,所以请耐心等待。我知道我可以在每个单独的字段上创建一个索引,我也可以在几个字段上创建一个多索引。例如,我可以做一个索引:
MongoDB
如果有人搜索某个类别,而不是设计师或商店,那么就会出现明显的问题。
我目前正在使用db.products.ensureIndex({designer: 1, store: 1, category: 1, name: 1, gender: 1, price: 1})
运算符查找这些字词,因此我的问题是:
如何创建一个允许这种搜索灵活性的索引?我是否必须为这6个术语的每个可能组合创建索引?或者,如果我在搜索中使用$and
,就可以为每个单独的术语编制索引,并且我会获得最佳效果吗?
答案 0 :(得分:2)
$and
不起作用,因为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 } } } }
] } )
在这两种情况下,都使用索引,但仅适用于$and
元素的第一部分。因此,请检查哪个键类型具有最多值,并在查询中相应地排序$and
元素。