def mongo_request(dataset_name, mongo_db_client, db_name, db_collection_name, find_dict, return_fields, per_page,
                  page_num, sort_field=None, sort_direction=None):
    """
    Запрос к базе данных mongoDB
    :return: строка с ответом из базы данных в формате JSON
    """
    response_format = find_dict.pop('format', '')
    report = find_dict.pop('get_report', False)

    if not return_fields: return_fields = {u"FakeField": 0}
    if len(return_fields) == 0: return_fields[u"FakeField"] = 0
    if page_num > 0: page_num -= 1

    if report:
        per_page = MONGO_LIMIT_REPORT

    mongo_db = mongo_db_client[db_name]
    mongo_collection = mongo_db[db_collection_name]
    if sort_field is None or sort_direction is None:
        data_cursor = mongo_collection.find(find_dict, return_fields).limit(per_page).skip(per_page * page_num)
    else:
        try:
            data_cursor = mongo_collection.find(find_dict, return_fields).sort(sort_field, direction=sort_direction).limit(
                per_page) \
                .skip(per_page * page_num)
        except:
            data_cursor = mongo_collection.find(find_dict, return_fields).limit(per_page).skip(per_page * page_num)
    total = data_cursor.count()
    total_on_page = data_cursor.count(True)
    mongo_db_client.disconnect()

    if report and total_on_page > 0:
        data_str = get_report(data_cursor)
    elif total_on_page > 0:
        data_str = pretty_data(data_cursor, dataset_name, total, per_page, page_num, response_format,
                               keys=return_fields)
    else:
        data_str = None
    return data_str
def mongo_requestIN(dataset_name, mongo_db_client, db_name, db_collection_name, id_list, find_dict, return_fields,
                    per_page, page_num, sort_field=None, sort_direction=None, sort_by_revelance=False, search_data=None,
                    format='json', report=False):
    """
    Запрос к базе данных mongoDB (поиск документов только
    :return: строка с ответом из базы данных в формате JSON
    """
    if not return_fields: return_fields = {u"FakeField": 0}
    if len(return_fields) == 0: return_fields[u"FakeField"] = 0
    if page_num > 0: page_num -= 1
    MNGdb = mongo_db_client[db_name]
    MNGcoll = MNGdb[db_collection_name]
    if sort_by_revelance:
        search_id_list = list()
        docList = list()
        for doc_id, search_rank in search_data.iteritems():
            docList.append({u"id": doc_id, u"searchRank": search_rank})
        search_id_list = sorted(docList, key=lambda doc: doc[u"searchRank"])[per_page * page_num:per_page * (page_num + 1)]
        search_id_list = map(lambda doc: dbid(doc[u"id"]), search_id_list)
        find_dict[u"_id"] = {u"$in": search_id_list}
    else:
        find_dict[u"_id"] = {u"$in": id_list}

    if report:
        per_page = SPHNX_LIMIT_REPORT

    if sort_field == None or sort_direction == None:
        if sort_by_revelance:
            data_cursor = MNGcoll.find(find_dict, return_fields)
        else:
            data_cursor = MNGcoll.find(find_dict, return_fields).limit(per_page).skip(per_page * page_num)
    else:
        try:
            data_cursor = MNGcoll.find(find_dict, return_fields).sort(sort_field, direction=sort_direction).limit(
                per_page).skip(per_page * page_num)
        except:
            data_cursor = MNGcoll.find(find_dict, return_fields).limit(per_page).skip(per_page * page_num)
    if sort_by_revelance:
        if len(find_dict) == 1:
            total_on_page = len(search_id_list)
            total = len(id_list)
        else:
            total_on_page = data_cursor.count()
            find_dict[u"_id"] = {u"$in": id_list}
            total = MNGcoll.find(find_dict, return_fields).limit(per_page).skip(per_page * page_num).count()
            find_dict[u"_id"] = {u"$in": search_id_list}
    else:
        total = data_cursor.count()
        total_on_page = data_cursor.count(True)
    mongo_db_client.disconnect()
    if total_on_page > 0:
        # TODO: заглушка на json
        if report:
            data_str = get_report(data_cursor)
        elif sort_by_revelance:
            data_str = preparation_response(data_cursor, dataset_name, total, per_page, page_num, format, search_data)
        else:
            data_str = preparation_response(data_cursor, dataset_name, total, per_page, page_num, format)
    else:
        data_str = None
    return data_str