如何创建部分多键索引以仅索引在索引字段中包含非空数组的文档?

时间:2017-03-27 21:58:27

标签: mongodb mongodb-indexes

在MongoDB中,我的文档看起来像

{
  _id: 1,
  name: "foo",
  tags: ['someTag', 'someOtherTag'],
}

我的大多数文档都没有标记,因此他们的标记字段设置为tags: [],但我需要经常访问那些有标记的文档。

我想在这里使用部分索引,因为它会比我在{ tags: 1 }上创建索引时创建一个小得多的索引,但我能想到的最好方法是

db.myThings.createIndex({ tags: 1 }, 
  { partialFilterExpression: { "tags.0": { $exists: true } } } });

哪个有效,因为当我执行db.myThings.stats()时,它显示它创建了一个小得多的索引,但为了使用索引我现在需要通过

查询
db.myThings.find({ "tags.0": { $exists: true }, tags: "someTag" })

如果我在查询中不包含"tags.0": { $exists: true },mongo将不会使用该索引。

我知道我可以根据tags字段本身的存在创建部分索引,但我也希望能够使用$pull更新来修改数组,这不会自动删除数组拉动最后一个元素的文档。

有没有更好的方法来做到这一点,我不需要总是记得在我想要使用部分索引的所有查询中包含"tags.0": { $exists: true }

1 个答案:

答案 0 :(得分:0)

如果文档没有任何标记,请不要在文档中放置标记:[]并使用

创建索引
db.myThings.createIndex({ tags: 1 },{ sparse: true })

创建sparse索引的内容。这仅为那些真正存在的文档和标记创建索引。

相关问题