Каталог и индексы MongoDB

mongodb116-index-same-variant

Это строки реального запуска на синтетических документах. Своя коллекция после проверки удалена.

УсловиеФактический результат
Раздельные условия11, 12
Один элемент через $elemMatch12
Название подходящего товараКружка B

Наблюдения этого запуска

Планы и время ниже — диагностика конкретного стенда, не норматив скорости. Случайные имена учебных объектов заменены подписями.

Документы с вариантами
[
    {
        "_id": 11,
        "title": "Кружка A",
        "variants": [
            {
                "color": "red",
                "stock": 0
            },
            {
                "color": "blue",
                "stock": 4
            }
        ]
    },
    {
        "_id": 12,
        "title": "Кружка B",
        "variants": [
            {
                "color": "red",
                "stock": 5
            },
            {
                "color": "blue",
                "stock": 0
            }
        ]
    },
    {
        "_id": 13,
        "title": "Кружка C",
        "variants": [
            {
                "color": "blue",
                "stock": 7
            }
        ]
    }
]
План заданного multikey-индекса
{
    "explainVersion": "1",
    "queryPlanner": {
        "namespace": "<учебная база>.<учебная коллекция>",
        "parsedQuery": {
            "variants": {
                "$elemMatch": {
                    "$and": [
                        {
                            "color": {
                                "$eq": "red"
                            }
                        },
                        {
                            "stock": {
                                "$gt": 0
                            }
                        }
                    ]
                }
            }
        },
        "indexFilterSet": false,
        "queryHash": "D47AC6D7",
        "planCacheShapeHash": "D47AC6D7",
        "planCacheKey": "64E5D2C0",
        "optimizationTimeMillis": 0,
        "maxIndexedOrSolutionsReached": false,
        "maxIndexedAndSolutionsReached": false,
        "maxScansToExplodeReached": false,
        "prunedSimilarIndexes": false,
        "winningPlan": {
            "isCached": false,
            "stage": "LIMIT",
            "limitAmount": 10,
            "inputStage": {
                "stage": "FETCH",
                "filter": {
                    "variants": {
                        "$elemMatch": {
                            "$and": [
                                {
                                    "color": {
                                        "$eq": "red"
                                    }
                                },
                                {
                                    "stock": {
                                        "$gt": 0
                                    }
                                }
                            ]
                        }
                    }
                },
                "inputStage": {
                    "stage": "IXSCAN",
                    "keyPattern": {
                        "variants.color": 1,
                        "variants.stock": 1
                    },
                    "indexName": "variant_stock",
                    "isMultiKey": true,
                    "multiKeyPaths": {
                        "variants.color": [
                            "variants"
                        ],
                        "variants.stock": [
                            "variants"
                        ]
                    },
                    "isUnique": false,
                    "isSparse": false,
                    "isPartial": false,
                    "indexVersion": 2,
                    "direction": "forward",
                    "indexBounds": {
                        "variants.color": [
                            "[\"red\", \"red\"]"
                        ],
                        "variants.stock": [
                            "(0, inf.0]"
                        ]
                    }
                }
            }
        },
        "rejectedPlans": []
    },
    "executionStats": {
        "executionSuccess": true,
        "nReturned": 1,
        "executionTimeMillis": 0,
        "totalKeysExamined": 1,
        "totalDocsExamined": 1,
        "executionStages": {
            "isCached": false,
            "stage": "LIMIT",
            "nReturned": 1,
            "executionTimeMillisEstimate": 0,
            "works": 2,
            "advanced": 1,
            "needTime": 0,
            "needYield": 0,
            "saveState": 0,
            "restoreState": 0,
            "isEOF": 1,
            "limitAmount": 10,
            "inputStage": {
                "stage": "FETCH",
                "filter": {
                    "variants": {
                        "$elemMatch": {
                            "$and": [
                                {
                                    "color": {
                                        "$eq": "red"
                                    }
                                },
                                {
                                    "stock": {
                                        "$gt": 0
                                    }
                                }
                            ]
                        }
                    }
                },
                "nReturned": 1,
                "executionTimeMillisEstimate": 0,
                "works": 2,
                "advanced": 1,
                "needTime": 0,
                "needYield": 0,
                "saveState": 0,
                "restoreState": 0,
                "isEOF": 1,
                "docsExamined": 1,
                "alreadyHasObj": 0,
                "inputStage": {
                    "stage": "IXSCAN",
                    "nReturned": 1,
                    "executionTimeMillisEstimate": 0,
                    "works": 2,
                    "advanced": 1,
                    "needTime": 0,
                    "needYield": 0,
                    "saveState": 0,
                    "restoreState": 0,
                    "isEOF": 1,
                    "keyPattern": {
                        "variants.color": 1,
                        "variants.stock": 1
                    },
                    "indexName": "variant_stock",
                    "isMultiKey": true,
                    "multiKeyPaths": {
                        "variants.color": [
                            "variants"
                        ],
                        "variants.stock": [
                            "variants"
                        ]
                    },
                    "isUnique": false,
                    "isSparse": false,
                    "isPartial": false,
                    "indexVersion": 2,
                    "direction": "forward",
                    "indexBounds": {
                        "variants.color": [
                            "[\"red\", \"red\"]"
                        ],
                        "variants.stock": [
                            "(0, inf.0]"
                        ]
                    },
                    "keysExamined": 1,
                    "seeks": 1,
                    "dupsTested": 1,
                    "dupsDropped": 0
                }
            }
        }
    },
    "queryShapeHash": "7C9D1B23A4D37205636B89CB5389272032E9B855BDAAC8E41618343732EB86AE",
    "command": {
        "find": "<учебная коллекция>",
        "filter": {
            "variants": {
                "$elemMatch": {
                    "color": "red",
                    "stock": {
                        "$gt": 0
                    }
                }
            }
        },
        "hint": "variant_stock",
        "limit": 10,
        "maxTimeMS": 1000,
        "$db": "<учебная база>"
    },
    "ok": 1
}

PHP 8.5.11; mongodb 2.5.5; MongoDB 8.0.34.