在MongoDB 3.2中创建部分索引冻结插入

时间:2016-04-22 22:43:38

标签: mongodb indexing background

我尝试使用以下命令在大小为156 Gb的集合上创建部分索引:

db.banners.createIndex({campSubTypeId: 1}, {partialFilterExpression: { campSubTypeId: {$exists: true} }}, {background: true})

发出命令时,不会发生插入(我可以在mongostats中看到)。

有什么问题?

系统:CentOS6.22,MongoDB 3.2,WiredTiger

2 个答案:

答案 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
      }
    }
  }
)