在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 }
?
答案 0 :(得分:0)
如果文档没有任何标记,请不要在文档中放置标记:[]并使用
创建索引db.myThings.createIndex({ tags: 1 },{ sparse: true })
创建sparse索引的内容。这仅为那些真正存在的文档和标记创建索引。