在后台运行的MongoDB中创建索引失败时会发生什么

在后台运行的MongoDB中创建索引失败时会发生什么,mongodb,mongodb-.net-driver,Mongodb,Mongodb .net Driver,MongoDB中存在一些现有集合,需要通过编程方式更新这些集合以获得新索引。 因此,在我的ASP.net应用程序中有一个管理web API,当调用该API时,它将调用MongoDB中的创建索引API。为了不因索引建立过程而造成影响,在后台执行 根据索引定义,不知道现有数据是否良好。因为Mongo DB将索引键大小限制为1024,并且某些现有文档中索引字段的值总和可能超过1024 所以问题是什么时候会发生这种情况,如果索引构建因此而失败,会发生什么情况。 另外,我如何通过编程(C#驱动程序)在稍后

MongoDB中存在一些现有集合,需要通过编程方式更新这些集合以获得新索引。 因此,在我的ASP.net应用程序中有一个管理web API,当调用该API时,它将调用MongoDB中的创建索引API。为了不因索引建立过程而造成影响,在后台执行

根据索引定义,不知道现有数据是否良好。因为Mongo DB将索引键大小限制为1024,并且某些现有文档中索引字段的值总和可能超过1024

所以问题是什么时候会发生这种情况,如果索引构建因此而失败,会发生什么情况。 另外,我如何通过编程(C#驱动程序)在稍后的时间点查找索引生成操作的状态?

根据

如果现有文档的索引项超过索引键限制,MongoDB将不会在集合上创建索引。MongoDB的早期版本将创建索引,但不会为此类文档编制索引

这意味着,无论是背景还是前景,索引键过长都会导致创建失败。但是,无论您如何创建索引,这意味着如果索引生成失败,则在等待
index.CreateManyASync()方法返回的任务时,应该会引发异常通知您

由于您不确定数据是否会受到最大密钥长度的影响,因此我强烈建议您在生产前环境中进行测试,然后再尝试在生产中使用。由于生产(我假设)处于活动状态,预生产环境将无法精确匹配数据(写入仍在发生),因此将减少在生产中查找失败的索引生成的可能性

此外,即使能够构建索引,将来也会拒绝中断该键长度的写入。这可以通过设置服务器参数来避免。然而,这有它自己的一套警告。具体来说,

将failIndexKeyTooLong设置为false是一种临时解决方法,而不是索引键过大问题的永久解决方案。failIndexKeyTooLong设置为false时,如果查询使用的索引跳过索引字段超过索引键长度限制的文档,则查询可能返回不完整的结果

我强烈建议您在实现该特定参数之前阅读并理解这些文档

一般来说,许多人认为在运行时构建索引是一种不好的做法。如果集合已经为空,这不是什么大问题,但是对于具有大量数据的集合,这可能会导致create命令阻塞相当长的一段时间。在后台创建索引时,在繁忙的
mongod
上尤其如此


如果您要在副本集或分片集群上构建此索引,我强烈建议您在实现内置代码之前查看这些用例的具体情况。

谢谢您的回答。这很有帮助。因此,如果我理解正确,.net驱动程序将阻塞,直到后台索引创建成功/失败,然后如果存在任何索引键限制冲突,则索引将无法创建。因此,.net驱动程序API将失败。这是有道理的。只是澄清一下,创建索引的命令上的
wait
会阻塞,但整个驱动程序不会阻塞。在多线程应用程序(如ASP.NET应用程序)中,驱动程序仍将处理其他请求,即使是该集合上的请求。