MongoDb geoIntersects не использует IndexOnly

У меня есть коллекция под названием search2 с примерно 20000 документами вроде:

    {
        "loc": {
        "type": "Polygon",
        "coordinates": [
            [
            [
                43.78526674007639,
                11.14739998758569
            ],
            [
                43.78526674007639,
                11.183372851822439
            ],
            [
                43.79443488391605,
                11.183372851822439
            ],
            [
                43.79443488391605,
                11.264311796355125
            ],
            [
                43.812771171595415,
                11.264311796355125
            ],
            [
                43.83110745927479,
                11.264311796355125
            ],
            [
                43.83110745927479,
                11.273305012414314
            ],
            [
                43.849443746954144,
                11.273305012414314
            ],
            [
                43.858611890793824,
                11.273305012414314
            ],
            [
                43.858611890793824,
                11.264311796355125
            ],
            [
                43.8769481784732,
                11.264311796355125
            ],
            [
                43.8769481784732,
                11.246325364236752
            ],
            [
                43.88611632231286,
                11.246325364236752
            ],
            [
                43.88611632231286,
                11.237332148177565
            ],
            [
                43.895284466152546,
                11.237332148177565
            ],
            [
                43.895284466152546,
                11.228338932118376
            ],
            [
                43.904452609992234,
                11.228338932118376
            ],
            [
                43.904452609992234,
                11.165386419704065
            ],
            [
                43.895284466152546,
                11.165386419704065
            ],
            [
                43.895284466152546,
                11.156393203644878
            ],
            [
                43.88611632231286,
                11.156393203644878
            ],
            [
                43.8769481784732,
                11.156393203644878
            ],
            [
                43.858611890793824,
                11.156393203644878
            ],
            [
                43.849443746954144,
                11.156393203644878
            ],
            [
                43.849443746954144,
                11.165386419704065
            ],
            [
                43.83110745927479,
                11.165386419704065
            ],
            [
                43.83110745927479,
                11.156393203644878
            ],
            [
                43.812771171595415,
                11.156393203644878
            ],
            [
                43.812771171595415,
                11.14739998758569
            ],
            [
                43.79443488391605,
                11.14739998758569
            ],
            [
                43.78526674007639,
                11.14739998758569
            ]
            ]
        ]
        },
        "docId": 1,
        "docVote": 0,
        "title": "title-1",
        "_id": {
        "$oid": "5248725d2dd5622510000001"
        }
    }

Я определяю индекс с помощью этой команды:

    db.search2.ensureIndex({"loc":"2dsphere"});

В коллекции есть только этот индекс и индекс по умолчанию в поле "_id".

Когда я выполняю следующий запрос, я ожидаю, что параметр indexOnly из объяснений будет установлен true:

    db.search2.find({
        loc: {
        $geoIntersects: {
            $geometry: {
            type: "Polygon",
            coordinates: [
                [
                    [43.7269795, 11.1540365],
                    [43.7269796, 11.1540365],
                    [43.7269796, 11.1540366],
                    [43.7269795, 11.1540366],
                    [43.7269795, 11.1540365]
                ]
            ]
            }
        }
        }
    }, {
        loc: 1,
        _id: 0
    }).hint({"loc":"2dsphere"}).explain()

Но это результат:

    {
        "cursor" : "S2Cursor",
        "isMultiKey" : true,
        "n" : 14,
        "nscannedObjects" : 14,
        "nscanned" : 186,
        "nscannedObjectsAllPlans" : 14,
        "nscannedAllPlans" : 186,
        "scanAndOrder" : false,
        "indexOnly" : false,
        "nYields" : 0,
        "nChunkSkips" : 0,
        "millis" : 20,
        "indexBounds" : {

        },
        "nscanned" : 186,
        "matchTested" : NumberLong(80),
        "geoTested" : NumberLong(80),
        "cellsInCover" : NumberLong(1),
        "server" : "*******"
    }

Я замечаю, что isMultiKey является истинным, вызванным синтаксисом полигонов документов. Курсор - это S2Cursor, поэтому я полагаю, что этот индекс использовался. Но почему indexOnly является ложным? Из-за синтаксиса многоугольника? так что невозможно иметь IndexOnly = true? Спасибо заранее

3
задан MarcoBiagi 30 сент. '13 в 14:50
источник поделиться

1 ответ

indexОдно объяснение из здесь гласит:

indexOnly - это логическое значение, которое возвращает true, когда запрос покрывается индексом, указанным в поле курсора. Когда индекс охватывает запрос, MongoDB может соответствовать условиям запроса и возвращать результаты используют только индекс, потому что:

  • все поля в запросе являются частью этого индекса, а

  • все поля в запросе являются частью этого индекса, а

И из здесь в нем говорится:

Индекс не может охватывать запрос, если:

  • любое из индексированных полей в любом из документов в коллекции включает массив. Если индексированное поле является массивом, индекс становится индекс индекса с несколькими ключами и не может поддерживать закрытый запрос.
  • любое из индексированных полей - это поля в поддокументах.

Надеюсь, что это поможет

0
ответ дан fgakk 30 сент. '13 в 16:42
источник поделиться

Другие вопросы по меткам