elixir-mongo / mongodb

MongoDB driver for Elixir
Apache License 2.0
568 stars 157 forks source link

`Mongo.insert_many` does not `continue_on_error` when it encounters a `Mongo.WriteError` #346

Open toddholmberg opened 3 years ago

toddholmberg commented 3 years ago

Hello. I am getting a Mongo.WriteError when using Mongo.insert_many/4 with [continue_on_error: true]. I am setting the _id field, so can expect a duplicate key error once in a while. I assumed that continue_on_error would proceed in face of write errors. This is mentioned in an elixirforum post: https://elixirforum.com/t/understanding-dialyzer-error-the-pattern-can-never-match-the-type/31553

In the post it is suggested that Mongo.WriteError be added as an additional return type.

@type result(t) :: :ok | {:ok, t} | {:error, Mongo.Error.t()}

should be (I think) something like:

@type result(t) :: :ok | {:ok, t} | {:error, Mongo.Error.t()} | {:error, Mongo.WriteError.t()}

In the end, I just want insert_many to continue inserting the remaining items when it encounters write errors. Is this a possible change?

toddholmberg commented 3 years ago

A little more background: it appears that insert_many completes the insert up to the list member that causes the error. I recently tried to insert a list of documents, one of which caused a WriteError and the items in the tail of the list did not insert. I tested this by reversing the list, placing the tail messages in the head of the list, and the skipped messages inserted.