数组中嵌入式文档的部分索引

时间:2019-01-09 10:02:02

标签: mongodb mongodb-query query-performance mongodb-indexes

我在名为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"
      }
    }
  ]
}

我想获取其providercode属性中包含“ code1”的文章。

我正在使用此查询进行搜索:

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属性进行某种部分索引(仅对属性的providercode部分编制索引)?
  • 是否有一种方法可以跳过无效(太长)的attribute.value的索引编制(如mongodb <2.6)?

其他信息:

  • providercode值将始终是足够短的字符串以用于索引
  • 每个文章文档将具有providercode属性
  • 我正在使用mongodb 4.X

1 个答案:

答案 0 :(得分:0)

解决方案实际上很简单。

我做了这些索引:

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

我的查询现在正在使用attributes.value上的索引