MongoDB索引多输入搜索

时间:2013-08-06 09:33:32

标签: mongodb database-design mongodb-indexes database

我有一个搜索功能,如下所示:

mongoDB search function

此搜索的条件作为标准对象传递给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,就可以为每个单独的术语编制索引,并且我会获得最佳效果吗?

1 个答案:

答案 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元素。