【问题标题】:MongoDB indexing multi-input searchMongoDB索引多输入搜索
【发布时间】:2013-08-06 09:33:31
【问题描述】:

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

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

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

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

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

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

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

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

【问题讨论】:

  • explain 说什么?
  • @AjayGeorge 当我在什么上运行它时?
  • @AjayGeorge 是的,但是在哪个查找上?我在问当有多个搜索字段时哪个是最好的系统。你想让我索引每个人,然后在$andsearch 上做explain
  • 不要对所有 6 个字段进行操作,而是选择 2 或 3 并进行练习。单个字段的索引(使用 $and)与复合索引

标签: mongodb database-design mongodb-indexes database


【解决方案1】:

$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 元素进行排序。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-03-04
    • 1970-01-01
    • 2015-11-25
    • 2018-09-27
    • 2018-10-26
    • 1970-01-01
    • 2013-03-15
    • 2016-02-28
    相关资源
    最近更新 更多