Alex Smirnov
Alex Smirnov

Reputation: 587

How to properly write this query

Using pymongo v2.6, what it a proper way to write a find query with these conditions:

select * from tasks where processed = 0 AND (process_lock_date is null or process_lock_date < now - 10 minutes) order by date_added asc limit 50

Basically need to write the query to select 50 records that haven't been picked up by a processor yet or haven't been processed and were picked up more than 10 minutes ago (ie pickup unprocessed tasks that were picked up longer time ago and didn't get marked as processed in case previous processor failed)

Any help is appreciated. Thank you.

Upvotes: 1

Views: 68

Answers (1)

chridam
chridam

Reputation: 103445

You need to import the timedelta and datetime objects first to create a date object that represents the datetime 10 minutes ago, use that object for you mongodb query as follows:

from datetime import timedelta 

date = datetime.datetime.now() - datetime.timedelta(minutes=10)
docs = db.collection.find(
    {
        'processed': 0,
        '$or': [
            {'process_lock_date': {'$lt': date}},
            {'process_lock_date': null}
        ]
    }).sort({'date_added': 1}).limit(50)

for doc in docs:
    print(doc)

Upvotes: 1

Related Questions