Searching In GitDB¶
Similarly to MongoDB, GitDB queries can either be really simple checks of equality, or more complex tests of a value using Python’s extensive set of methods and functions. This page will describe how to use the search functions, for information on writing your own, see gitdb.search_functions. There is also an extensive testing suite for searching in the tests/test_gitdb.py file.
We will use a model that looks like this:
>>> import tempfile; db_directory = tempfile.TemporaryDirectory()
>>>
>>> import ogitm
>>> class MyModel(ogitm.Model, db=db_directory.name):
... name = ogitm.fields.String()
... age = ogitm.fields.Integer()
... has_hair = ogitm.fields.Boolean()
>>> bob = MyModel(name="Bob", age=93, has_hair=False)
>>> bert = MyModel(name="Bert", age=23, has_hair=True)
>>> bex = MyModel(name="Bex", age=32, has_hair=True)
>>> bub = MyModel(name="Bubba", age=3243, has_hair=False)
Scalar Searches¶
Checking if something equals something else is the easiest check of all.
>>> MyModel.find(name="Bex").first() == bex
True
>>> MyModel.find(age=34).all()
[]
>>> len(MyModel.find(has_hair=True))
2
Comparison¶
The comparison operators (>, <, >=, <=, and ==) are supported with aliases. Generally, the query a={'>': b} will return all values of a such that a > b.
| Operator | Shorthand | Longhand |
|---|---|---|
| > | 'gt' | 'greater-than' |
| < | 'lt' | 'less-than' |
| >= | 'gte' | 'greater-than-equal' |
| <= | 'lte' | 'less-than-equal' |
| == | 'eq' | 'equal' |
>>> len(MyModel.find(age={'lt': 30}))
1
>>> len(MyModel.find(age={'gte': 32}))
3
>>> # Note that this also works for any
>>> # other type with a total ordering
>>> len(MyModel.find(name={'lt': 'Bf'}))
2
>>> # 'eq' will work for any two equivalent items
>>> MyModel.find(name={'eq': 'Bert'}) == MyModel.find(name='Bert')
True
String Checks¶
String types can be checked using the various is*() string methods, as well as startswith() and endswith(). These are hardcoded, but delegate to the string’s natural methods. If you can think of some way of automatically selecting all string methods that return a boolean, please let me know!
>>> len(MyModel.find(name={'startswith': 'B'}))
4
>>> len(MyModel.find(name={'isalpha': True}))
4
Existence¶
Testing for existence isn’t usually necessary when using models, as (assuming that you only use the model to insert documents), you know that the only fields that will exist will be the fields you inserted. It is more useful when using arbitrary documents with the raw GitDB instance. However, the syntax of the check is the same in both cases.
>>> len(MyModel.find(name={'exists': True}))
4
>>> len(MyModel.find(name={'exists': False}))
0