我尝试使用以下命令在大小为156 Gb的集合上创建部分索引:
db.banners.createIndex({campSubTypeId: 1}, {partialFilterExpression: { campSubTypeId: {$exists: true} }}, {background: true})
发出命令时,不会发生插入(我可以在mongostats中看到)。
有什么问题?
系统:CentOS6.22,MongoDB 3.2,WiredTiger
答案 0 :(得分:0)
这是预期的行为。你有两个选择。
1)在后台创建索引。这将花费更多时间,但不会阻止其他操作。
默认情况下,创建索引会阻止数据库上的所有其他操作。在集合上构建索引时,在索引构建完成之前,保存集合的数据库不可用于读取或写入操作。任何需要对所有数据库(例如listDatabases)进行读或写锁定的操作都将等待前台索引构建完成。
2)在非高峰时段创建索引,或者理想情况下,如果您有副本集,请先在辅助节点上创建索引,然后在降级后创建主节点。 MongoDB建议
如果您的集合包含大量数据,并且您的应用程序需要能够在构建索引时访问数据,请考虑在后台构建索引,如背景构造中所述。要在副本集上构建索引,请参阅“在副本集上构建索引”部分以获取更多信息。
有关详细信息,请参阅Documentation。
答案 1 :(得分:0)
我认为问题在于您需要将background: true
密钥放在与partialFilterExpression
密钥相同的部分中。
来自docs:
您可以将背景选项与其他选项结合使用,如下所示:
db.people.createIndex( { zipcode: 1 }, { background: true, sparse: true } )
所以你会使用这个命令:
db.banners.createIndex(
{ campSubTypeId: 1 },
{
background: true,
partialFilterExpression: {
campSubTypeId: {
$exists: true
}
}
}
)