2013-01-22 1 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 »}}' to '{Спецификация: [{Тело:« 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 из этих спецификаций. Должен ли я создать составной индекс для всех? –