在 mongodb中创建索引时,可以指定背景:true标志,这将导致索引创建为非阻塞.这是非常好的生产,因为你不希望整个数据库锁定,同时创建一个你显然没有严格需要的索引(因为你没有). 阅读docs,似乎这个标志只能确定索引是如何创建的,一旦它被完成,索引就像一个正常的索引一样.我想要什么 – 我不希望索引与文档不同步,因为它在后台更新,虽然我可以想象一个数据库,这样做.
我在这里问,因为getIndexes命令显示索引仍然被标记为背景,即使创建它之后.这只是一个提醒,它是如何创建的?或者后台索引在创建后的行为有所不同?也许有些微妙的复制?
创建后,它们就像常规索引一样.他们坚持在getIndexes提醒,类似于独特,稀疏等等. 但它也有其他含义.只是因为前台索引阻止所有写入器,在这种情况下,直到创建所有索引为止,才能执行db.testCollection.getIndexes().同时,当您创建后台索引时,您可以调用db.testCollection.getIndexes(),并且您将看到该索引似乎已经创建.
但在这种情况下,我们无法确定索引是否实际创建.在这种情况下,你需要调用db.currentOp(),如果你看到类似的东西
{
"inprog": [
{
"opid": 2001060,
"active": true,
"secs_running": 1,
"op": "insert",
"ns": "test.system.indexes",
"insert": {
"v": 1,
"key": {
"a": 1
},
"ns": "test.testCollection",
"name": "a_1",
"background": 1
},
....
"msg": "bg index build Background Index Build Progress: 368640/1000000 36%",
"progress": {
"done": 368640,
"total": 1000000
}
...
}
]
}
那么这意味着,后台索引的创建仍在进行中,您还可以看到有关进程的一些信息.
例如,您可能会做一些粗略的计算:1000000中的368640需要1秒(1秒可能的偏移量),因此一切都需要3-6秒(最终需要4.8秒).
显然,如果您看不到这样的操作,那么索引已经被创建了.
注意:如果有许多并发操作,那么可以指定db.currentOp(),f.e的searref参数.
db.currentOp({"insert.background":1})
原文作者:后端Q;如有侵权,请联系管理员删除。