1

我有一个看起来像这样的搜索功能:

mongoDB搜索功能

此搜索的条件作为条件对象传递给MongoDB'方法,例如:find()

{
     designer: "Designer1".
     store: "Store1",
     category: "Category1",
     name: "Keyword",
     gender: "Mens",
     price: {$gte: 50}
}

我只是在学习indexesMongoDB所以请多多包涵。我知道我可以在每个单独的字段上创建一个索引,我也可以在几个字段上创建一个多索引。例如,对于一个索引,我可以这样做:

db.products.ensureIndex({designer: 1, store: 1, category: 1, name: 1, gender: 1, price: 1}) 

如果有人搜索,例如,一个类别,而不是设计师或商店,就会出现明显的问题,它不会被索引。

我目前正在使用$and运算符查找这些术语,所以我的问题是

如何创建一个索引以允许这种类型的灵活搜索?我是否必须为这 6 个术语的每个可能组合创建一个索引?或者,如果我$and在搜索中使用它是否足以索引每个单独的术语并且我将获得最佳性能?

4

1 回答 1

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在查询中相应地对元素进行排序。

于 2013-08-06T11:04:15.750 回答