当我在分片群集上的批量插入上使用安全模式(仅限日记)时,结果将作为C#驱动程序上的SafeModeResult列表返回(我假设它在其他驱动程序上也类似)。列表中的每个结果意味着什么?
是批处理中的每个项目还是每个分片,还是每个消息发送到服务器?
批量插入是原子的还是不是特别是在分片环境中?如果没有,我怎么知道我的批次哪个部分失败了?
答案 0 :(得分:5)
C#驱动程序中的InsertBatch方法确实尝试在一条消息中将所有文档发送到服务器。但是,消息长度有一个限制,大约是16MB。因此,如果您提供的InsertBatch批处理非常大,那么InsertBatch可能必须将其分解为子批处理,以便不超过最大消息长度。当发生这种情况时,您将为每个子批次获得单独的SafeModeResult,但通常您会希望返回的SafeModeResults列表仅包含一个SafeModeResult。
答案 1 :(得分:1)
实际上并不是它与其他驱动程序的关系,我无法想到为什么它会为实际批量插入返回每个插入的写入结果的一个很好的理由,因为这会破坏批量插入的目的/优化(其中被认为是MongoDB的一个操作,因此只需要一个getLastError()调用。
实际批量插入的工作原理是,MongoDB执行批量插入操作,而驱动程序不会对每个插入执行getLastError()调用。这有一个明显的缺点,你不能看到插入是否成功除了批处理中的最后一个(在ContinueOnError = false的情况下)或其中任何一个失败(在ContinueOnError = true的情况下,其中如果实际错误与最后一次失败的插入有关。)
您正在使用的批处理插入的C#驱动程序方法实际上是一种方便的方法,它为每个插入执行insert / getLastError对。这样可以正常工作并告诉您哪个插件失败了,但它不是实际的批量插入,也没有利用优化。
批量插入不是原子的。它们只是一种减少getLastError()开销的优化。