Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MongoDB索引多输入搜索_Mongodb_Database Design_Mongodb Indexes_Database - Fatal编程技术网

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)与复合索引