Частичная индексация внедренного документа в массив - PullRequest
0 голосов
/ 09 января 2019

У меня есть следующие данные в коллекции с именем articles:

{
  "_id": "1",
  "attributes": [
    {
      "id": "providercode",
      "value": "code1"
    },
    {
      "id": "otherAttribute",
      "value": "very long value than will be longer than 1024 bytes limit of an index value so I will get 'got unwanted exception: WiredTigerIndex::insert: key too large to index'"
    },
    {
      "id": "objectAttr",
      "value": {
        "ican": "alsobeanobject"
      }
    }
  ]
}

Я хочу получить статьи, имеющие "code1" в его атрибуте providercode.

Я ищу по этому запросу:

db.articles.find({ attributes: { $elemMatch: { "id": "providercode", "value": "code1" }}})

Мне нужен индекс, который будет применяться к предыдущему запросу.

Я попробовал этот индекс:

db.articles.ensureIndex({ "attributes.id": 1, "attributes.value": 1 })

Это может сработать, но не сработает из-за потенциально очень больших строк в attributes.value.

Я получаю ошибку:

Error got unwanted exception: WiredTigerIndex::insert: key too large to index

Мой вопрос (ы):

  • есть ли способ сделать своего рода частичный индекс для моего атрибута кода провайдера (индексировать только часть атрибутов providercode)?
  • Есть ли способ пропустить индексацию недопустимого (слишком длинного) attribute.value (как при mongodb <2.6)? </li>

Дополнительная информация:

  • providercode значение всегда будет достаточно короткой для индекса
  • каждый документ статьи будет иметь атрибут поставщика кода
  • Я с mongodb 4.X

1 Ответ

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

Решение было на самом деле простым.

Я сделал эти индексы:

db.articles.ensureIndex({ "attributes.id": 1 });
db.articles.ensureIndex({ "attributes.value": "hashed" });

И мой запрос теперь использует индекс на attributes.value

...