我需要在大型MongoDB集合中构建五个索引。我熟悉ensureIndex操作,但我不知道用单个命令创建所有五个索引的方法。是否可以在MongoDB中创建批处理索引?
答案 0 :(得分:8)
这在shell中非常简单,有一个createIndexes
集合的扩展,你只需传入你想要创建索引的键。
db.test.createIndexes([
{ "a" : 1 },
{ "b" : 1 },
{ "c" : 1 },
{ "d" : 1 },
{ "e" : 1 }
]);
这将为我们提供以下内容
> db.test.getIndexes()
[
{
"v" : 2,
"key" : {
"_id" : 1
},
"name" : "_id_",
"ns" : "test.test"
},
{
"v" : 2,
"key" : {
"a" : 1
},
"name" : "a_1",
"ns" : "test.test"
},
{
"v" : 2,
"key" : {
"b" : 1
},
"name" : "b_1",
"ns" : "test.test"
},
{
"v" : 2,
"key" : {
"c" : 1
},
"name" : "c_1",
"ns" : "test.test"
},
{
"v" : 2,
"key" : {
"d" : 1
},
"name" : "d_1",
"ns" : "test.test"
},
{
"v" : 2,
"key" : {
"e" : 1
},
"name" : "e_1",
"ns" : "test.test"
}
]
>
答案 1 :(得分:2)
你错了,Mongo自2.6(2014年之前发布)以来有 createIndexes 命令
https://docs.mongodb.com/v3.0/reference/command/createIndexes/
文档说,它需要一次通过收集,所以它应该快大约5倍。
答案 2 :(得分:0)
至于现在,没有解决方案。
后台将阻止数据库锁定并允许执行其他操作。但要运行这些操作,您必须打开新的mongo shell或以您选择的语言(如js)异步运行它们。
但如果您需要强大的一致性并且不需要构建背景索引......您可能需要等待MongoDB原生解决方案的到来。
答案 3 :(得分:-1)
我认为使用单个命令是不可能的,但您可以创建自己的脚本来执行相同的操作。如果您的集合大小很大,那么我建议您使用background true分别构建索引,以减少出现任何锁定问题的可能性。
db.collection.ensureIndex( { a: 1 }, { background: true } )