def _find_raw(cls, filter, projection=None, skip=0, limit=0, sort=None, slave_ok=SlaveOkSetting.PRIMARY, find_one=False, hint=None, batch_size=10000, max_time_ms=None, session=None): # transform query filter = cls._update_filter(filter) with log_slow_event('find', cls._meta['collection'], filter): pymongo_collection = cls._pymongo(slave_ok_setting=slave_ok) cur = pymongo_collection.find(filter, projection, skip=skip, limit=limit, sort=sort, session=session and session.pymongo_session) max_time_ms = max_time_ms or cls.MAX_TIME_MS cls._check_read_max_time_ms( 'find', max_time_ms, pymongo_collection.read_preference) if max_time_ms > 0: cur.max_time_ms(max_time_ms) if hint: cur.hint(hint) if find_one: for result in cur.limit(1): return result return None else: cur.batch_size(batch_size) return cur
def _count(cls, slave_ok=SlaveOkSetting.PRIMARY, filter={}, hint=None, limit=None, skip=0, max_time_ms=None, session=None): filter = cls._update_filter(filter) pymongo_collection = cls._pymongo(slave_ok_setting=slave_ok) max_time_ms = max_time_ms or cls.MAX_TIME_MS cls._check_read_max_time_ms( 'count_documents', max_time_ms, pymongo_collection.read_preference) with log_slow_event('count_documents', cls._meta['collection'], filter): kwargs_dict = { 'skip': skip, } if hint: kwargs_dict.update({ 'hint': hint }) if limit > 0: kwargs_dict.update({ 'limit': limit }) if max_time_ms > 0: kwargs_dict.update({ 'maxTimeMS': max_time_ms }) if session: kwargs_dict.update({ 'session': session.pymongo_session }) return pymongo_collection.count_documents(filter, **kwargs_dict)
def update_one(self, document, session=None): document = self._transform_value(document) query_filter = self._update_one_key() with log_slow_event("update_one", self._meta['collection'], query_filter): result = self.find_and_modify(query_filter, update=document, new=True, session=session) if result: for field in self._fields: setattr(self, field, result[field]) return result
def remove(cls, filter, multi=True, session=None): filter = cls._update_filter(filter) with log_slow_event("remove", cls._meta['collection'], filter): pymongo_collection = cls._pymongo() if multi: result = pymongo_collection.delete_many( filter, session=session and session.pymongo_session) else: result = pymongo_collection.delete_one( filter, session=session and session.pymongo_session) result_dict = { 'deleted_count': result.deleted_count, } result_dict.update(result.raw_result) return result_dict
def find_and_modify(cls, filter, update=None, sort=None, remove=False, new=False, projection=None, upsert=False, session=None): if not update and not remove: raise ValueError("Cannot have empty update and no remove flag") # handle queries with inheritance filter = cls._update_filter(filter) update = cls._transform_value(update) from pymongo.collection import ReturnDocument with log_slow_event("find_and_modify", cls._meta['collection'], filter): pymongo_collection = cls._pymongo() if remove: result = pymongo_collection.find_one_and_delete( filter, sort=sort, projection=projection, session=session and session.pymongo_session) else: result = pymongo_collection.find_one_and_update( filter, update, sort=sort, projection=projection, upsert=upsert, return_document=ReturnDocument.AFTER if new else ReturnDocument.BEFORE, session=session and session.pymongo_session) if result: return cls._from_son(result) else: return None
def update(cls, filter, document, upsert=False, multi=True, session=None): document = cls._transform_value(document) filter = cls._update_filter(filter) with log_slow_event("update", cls._meta['collection'], filter): pymongo_collection = cls._pymongo() if multi: result = pymongo_collection.update_many( filter, document, upsert=upsert, session=session and session.pymongo_session) else: result = pymongo_collection.update_one( filter, document, upsert=upsert, session=session and session.pymongo_session) result_dict = { 'matched_count': result.matched_count, 'modified_count': result.modified_count, 'upserted_id': result.upserted_id, } result_dict.update(result.raw_result) return result_dict