123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103 |
- # SPDX-License-Identifier: AGPL-3.0-or-later
- """MongoDB_ is a document based database program that handles JSON like data.
- Before configuring the ``mongodb`` engine, you must install the dependency
- pymongo_.
- Configuration
- =============
- In order to query MongoDB_, you have to select a ``database`` and a
- ``collection``. Furthermore, you have to select a ``key`` that is going to be
- searched. MongoDB_ also supports the option ``exact_match_only``, so configure
- it as you wish.
- Example
- =======
- Below is an example configuration for using a MongoDB collection:
- .. code:: yaml
- # MongoDB engine
- # Required dependency: pymongo
- - name: mymongo
- engine: mongodb
- shortcut: md
- exact_match_only: false
- host: '127.0.0.1'
- port: 27017
- enable_http: true
- results_per_page: 20
- database: 'business'
- collection: 'reviews' # name of the db collection
- key: 'name' # key in the collection to search for
- Implementations
- ===============
- """
- import re
- try:
- from pymongo import MongoClient # type: ignore
- except ImportError:
- # import error is ignored because the admin has to install pymongo manually
- # to use the engine
- pass
- engine_type = 'offline'
- # mongodb connection variables
- host = '127.0.0.1'
- port = 27017
- username = ''
- password = ''
- database = None
- collection = None
- key = None
- # engine specific variables
- paging = True
- results_per_page = 20
- exact_match_only = False
- result_template = 'key-value.html'
- _client = None
- def init(_):
- connect()
- def connect():
- global _client # pylint: disable=global-statement
- kwargs = {'port': port}
- if username:
- kwargs['username'] = username
- if password:
- kwargs['password'] = password
- _client = MongoClient(host, **kwargs)[database][collection]
- def search(query, params):
- results = []
- if exact_match_only:
- q = {'$eq': query}
- else:
- _re = re.compile('.*{0}.*'.format(re.escape(query)), re.I | re.M)
- q = {'$regex': _re}
- query = _client.find({key: q}).skip((params['pageno'] - 1) * results_per_page).limit(results_per_page)
- results.append({'number_of_results': query.count()})
- for r in query:
- del r['_id']
- r = {str(k): str(v) for k, v in r.items()}
- r['template'] = result_template
- results.append(r)
- return results
|