Пример #1
0
    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
Пример #2
0
 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)
Пример #3
0
 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
Пример #4
0
 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
Пример #5
0
 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
Пример #6
0
 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