MongoDB создает индекс всех текстовых значений ключа внутри массивов - PullRequest
0 голосов
/ 02 января 2019

Я пытаюсь сгенерировать индекс mongodb для текстовых значений для следующих ключей: CVE_data_meta, vendor_name и product_name.Значения являются частью массивов.

Мой код выглядит следующим образом:

col.createIndex({
    'cve.affects.vendor.vendor_data.vendor_name': 'text',
    'cve.affects.vendor.vendor_data.product.product_data.product_name': 'text',
    'cve.CVE_data_meta.ID': 'text'
  }).then(() => {
    db.close();

Проблема, с которой я сталкиваюсь - 'namespace name generated from index name "vulndbapi.nvd.$cve.affects.vendor.vendor_data.vendor_name_text_cve.affects.vendor.vendor_data.product.product_data.product_name_text_cve.CVE_data_meta.ID_text" is too long (127 byte max)'.Кроме того, если я просто попытаюсь выполнить индексирование по идентификатору CVE, поисковый запрос будет пустым.

Образец набора данных.Фактический набор данных намного больше.

    {
    "cve": {
        "data_type": "CVE",
        "data_format": "MITRE",
        "data_version": "4.0",
        "CVE_data_meta": {
            "ID": "CVE-2012-0001",
            "ASSIGNER": "cve@mitre.org"
        },
        "affects": {
            "vendor": {
                "vendor_data": [{
                    "vendor_name": "microsoft",
                    "product": {
                        "product_data": [{
                                "product_name": "windows_7",
                                "version": {
                                    "version_data": [{
                                        "version_value": "-",
                                        "version_affected": "="
                                    }]
                                }
                            },
                            {
                                "product_name": "windows_server_2003",
                                "version": {
                                    "version_data": [{
                                        "version_value": "*",
                                        "version_affected": "="
                                    }]
                                }
                            }
                        ]
                    }
                }]
            }
        }
    }
}

Мой код запроса:

col.find({
$text: {
    $search: 'CVE-2012-0001'
    // $search: 'firefox'
}
}).then((resolve) => {
console.log(resolve);
db.close();

Как я могу генерировать индексы, когда значение является частью массива, и индексировать все элементы этого массива?Окончательная коллекция превысит 50 тыс. Предметов

1 Ответ

0 голосов
/ 02 января 2019

Имя индекса по умолчанию - это объединенные имена включенных полей, что в вашем случае оказывается слишком длинным.Решение состоит в том, чтобы предоставить собственное имя для индекса:

col.createIndex({
    'cve.affects.vendor.vendor_data.vendor_name': 'text',
    'cve.affects.vendor.vendor_data.product.product_data.product_name': 'text',
    'cve.CVE_data_meta.ID': 'text'
  }, {name: 'vendor_product_text_index'})
...