2013-01-22 86 views
0

我有一个名为variants的集合,它的specifications作为子文档。使用点符号搜索变体适用于我(但不使用索引),而使用子文档格式返回零结果(但使用索引)。我做错了什么?MongoDB - 子文档搜索不起作用

> db.variants.getIndexes(); 
[ 
    { 
     "v" : 1, 
     "key" : { 
      "_id" : 1 
     }, 
     "ns" : "automobile.variants", 
     "name" : "_id_" 
    }, 
    { 
     "v" : 1, 
     "key" : { 
      "specifications" : 1 
     }, 
     "ns" : "automobile.variants", 
     "name" : "specifications_1" 
    } 
] 
> db.variants.find({"specifications" : { "Body" : "SUV" }}).explain() 
{ 
    "cursor" : "BtreeCursor specifications_1", 
    "nscanned" : 0, 
    "nscannedObjects" : 0, 
    "n" : 0, 
    "millis" : 0, 
    "nYields" : 0, 
    "nChunkSkips" : 0, 
    "isMultiKey" : false, 
    "indexOnly" : false, 
    "indexBounds" : { 
     "specifications" : [ 
      [ 
       { 
        "Body" : "SUV" 
       }, 
       { 
        "Body" : "SUV" 
       } 
      ] 
     ] 
    } 
} 
> db.variants.find({"specifications.Body" : "SUV" }).explain() 
{ 
    "cursor" : "BasicCursor", 
    "nscanned" : 787, 
    "nscannedObjects" : 787, 
    "n" : 176, 
    "millis" : 0, 
    "nYields" : 0, 
    "nChunkSkips" : 0, 
    "isMultiKey" : false, 
    "indexOnly" : false, 
    "indexBounds" : { 

    } 
} 

回答

1

您应该在确定的字段上进行查询,如specifications.Body。在您的第一个查询中,因为您在规格字段上有索引,查询使用索引,但根据您的模式它无效。

+0

谢谢,但我不能创建索引'Specifications.body',因为有在每个变体至少50个规格。我应该做些什么改变,以便查询具有一系列规格的变体(例如'{Body:'SUV',Capacity:4}'将使用索引? –

+1

然后,您需要在字段上具有复合索引你需要查询,注意在复合索引中查询的顺序很重要。http://docs.mongodb.org/manual/core/indexes/#index-type-compound – cubbuk

+0

有没有我可以修改的模式为更快的搜索?例如,更改'{规格:{正文:“SUV”}}''{规范:[{正文:“SUV”}]}' –

2

您已将索引放在子文档本身上。

当你这样做的MongoDB索引数组中的元素,因此如果你有:

{ 
    Specifications: [ 
     {Body: 'SUV'} 
    ] 
} 

如果你查询的MongoDB可以使用索引:

db.col.find({Specifications: {Body: 'SUV'}}) 

由于匹配该元素,但它不能通过该子文档的各个部分进行查询。

如果你想使用一个索引,你应该指数的部分,即由子文档的部分进行查询:

ensureIndex({Specifications.body: 1}) 
+0

谢谢,但我无法创建索引'Specifications.body',因为至少有50个规格为每个变体。我应该做什么改变,以便查询具有规格列表的变体(例如'{Body:'SUV',Capacity:4}'将使用索引? –

+0

@JoyceBabu您是否真的需要为所有或者只为最有选择性的领域? – Sammaye

+0

我会查询至少10个这些规范。我应该创建一个复合索引吗? –