Re: avoid exception in bulk insert with duplicate docs

From: Bernie Hackett <bernie@xxxxxxxxx>
To: mongodb-user <mongodb-user@xxxxxxxxxxxxxxxx>
Date: Fri, 6 May 2016 09:42:52 -0700 (PDT)
Why ads?
It's working as expected. See this part of the index documentation to 
understand why:

https://docs.mongodb.com/manual/core/index-unique/#unique-index-and-missing-field

The problem is two of your example documents don't include a 'test' field. 
However, ordered=False *is* working correctly. If it wasn't you wouldn't 
have any 'foo' documents inserted.

On Friday, May 6, 2016 at 4:42:03 AM UTC-7, Valentin Kuznetsov wrote:

Bernie,
it does not work and even the behavior is bizzare. Here is the code:

from pymongo import MongoClient, DESCENDING
from pymongo.errors import BulkWriteError

uri = 'mongodb://localhost:8230'
client = MongoClient(uri)
coll = client['test']['db']
coll.create_index([('test',DESCENDING)], unique=True)

docs = [{'test':1} for _ in range(2)] + [{'foo':1} for _ in range(2)]
print(docs)
try:
    coll.insert_many(docs, ordered=False)
except BulkWriteError:
    pass
docs = [{'bla':1} for _ in range(2)]
print(docs)
try:
    coll.insert_many(docs, ordered=False)
except BulkWriteError:
    pass

so I would expect to get 3 docs in db: test, foo and bar. And, I got only 
test and foo, but not bar, i.e. docs from the first insert_many are 
inserted, while from last one is not.

If I drop the ordered option, i.e. ordered=True, I get 2 docs, but this 
time only test and bar, but not foo.

So, first I never get my desired 3 docs, second the behavior is different. 
Is it a bug in pymongo driver or on a server?

Can someone have a look and explain?
Thanks,
Valentin.



On Thursday, May 5, 2016 at 7:45:24 PM UTC-4, Bernie Hackett wrote:

The insert_many method has an "ordered" option (so does bulk_write). Pass 
False for that option and all inserts will be attempted, with any errors 
reported at the end.


http://api.mongodb.com/python/current/api/pymongo/collection.html#pymongo.collection.Collection.insert_many

On Thursday, May 5, 2016 at 4:29:11 PM UTC-7, Valentin Kuznetsov wrote:

Hi,
I'm trying to find out a way how I can insert bunch of docs via bulk 
python API, e.g. insert_many, where I may have a duplicate in my docs.
Current behavior stop when it encounters a duplicate error and it does 
not proceed afterwards because of thrown exception. I'd like to avoid that 
behavior and I want to bulk succeed and just skip duplicates. Here is a 
simple example:

from pymongo import MongoClient, DESCENDING
from pymongo.errors import BulkWriteError

uri = 'mongodb://localhost:8230'
client = MongoClient(uri)
coll = client['test']['db']
coll.create_index([('test',DESCENDING)], unique=True)

docs = [{'test':1} for _ in range(10)] + [{'foo':1 for _ in range(5)}]
try:
    coll.insert_many(docs)
except BulkWriteError:
    pass
docs = [{'bla':1} for _ in range(10)]
coll.insert_many(docs)

Doing so, I only see two docs in my test.db

{"test": 1, "_id": "572bd5392f74d466951ebb4a"}
{"_id": "572bd5392f74d466951ebb55", "bla": 1}

while I want to see 3 docs one with test, one with foo and one with bla 
keys.

We have an application which needs to write millions docs and I thought 
we can avoid a full scan to remove duplicates. Of course I can use plain 
insert, but it will be much slower operation.

Thanks,
Valentin.



-- 
You received this message because you are subscribed to the Google Groups "mongodb-user"
group.

For other MongoDB technical support options, see: https://docs.mongodb.org/manual/support/
--- 
You received this message because you are subscribed to the Google Groups "mongodb-user" group.
To unsubscribe from this group and stop receiving emails from it, send an email to mongodb-user+unsubscribe@xxxxxxxxxxxxxxxx.
To post to this group, send email to mongodb-user@xxxxxxxxxxxxxxxx.
Visit this group at https://groups.google.com/group/mongodb-user.
To view this discussion on the web visit https://groups.google.com/d/msgid/mongodb-user/fc145e81-c6fc-46fc-ab79-05e27fb4da5c%40googlegroups.com.
For more options, visit https://groups.google.com/d/optout.
Why ads?