MongoDB-запрос на вложенное поле с индексом

Я пытаюсь выяснить, как я должен структурировать запросы так, чтобы они попали в мой индекс. У меня документы структурированы так:

{ "attributes" : { "make" : "Subaru", "color" : "Red" } }

с индексом: db.stuff.ensureIndex({"attributes.make":1})

Я обнаружил, что запрос с использованием точечной нотации попадает в индекс, а запрос с документом - нет.

пример:

db.stuff.find({"attributes.make":"Subaru"}).explain()
{
"cursor" : "BtreeCursor attributes.make_1",
"nscanned" : 2,
"nscannedObjects" : 2,
"n" : 2,
"millis" : 0,
"nYields" : 0,
"nChunkSkips" : 0,
"isMultiKey" : false,
"indexOnly" : false,
"indexBounds" : {
    "attributes.make" : [
        [
            "Subaru",
            "Subaru"
        ]
    ]
}
}

vs

db.stuff.find({attributes:{make:"Subaru"}}).explain()
{
"cursor" : "BasicCursor",
"nscanned" : 2,
"nscannedObjects" : 2,
"n" : 0,
"millis" : 1,
"nYields" : 0,
"nChunkSkips" : 0,
"isMultiKey" : false,
"indexOnly" : false,
"indexBounds" : {

}
}

есть ли способ заставить запрос стиля документа попасть в индекс? Причина в том, что когда построение запросов из моих постоянных объектов намного проще сериализовать их как документы, а не что-то с использованием точечной нотации.

Я также добавлю, что мы используем домашний слой картографа данных, построенный с Джексоном. Поможет ли использование чего-то вроде морфия правильно построить эти запросы?

1 ответов


сделал еще несколько рытья и этой теме объясняет, что происходит с запросом поддокумента. Моя проблема выше заключалась в том, что для того, чтобы запрос на основе поддокумента действовал как точечная нотация, мне нужно было использовать elemMatch.

db.stuff.find({"attributes":{"$elemMatch" : {"make":"Subaru"}}}).explain()
{
"cursor" : "BtreeCursor attributes.make_1",
"nscanned" : 2,
"nscannedObjects" : 2,
"n" : 0,
"millis" : 2,
"nYields" : 0,
"nChunkSkips" : 0,
"isMultiKey" : false,
"indexOnly" : false,
"indexBounds" : {
    "attributes.make" : [
        [
            "Subaru",
            "Subaru"
        ]
    ]
}
}