Added hashed index, a bit more of geo-indexes, possibility to give _cls and docs

This commit is contained in:
Matthieu Rigal
2015-05-07 15:11:33 +02:00
parent 94eac1e79d
commit 283e92d55d
4 changed files with 118 additions and 12 deletions

View File

@@ -782,7 +782,7 @@ class BaseDocument(object):
allow_inheritance = cls._meta.get('allow_inheritance',
ALLOW_INHERITANCE)
include_cls = (allow_inheritance and not spec.get('sparse', False) and
spec.get('cls', True))
spec.get('cls', True) and '_cls' not in spec['fields'])
# 733: don't include cls if index_cls is False unless there is an explicit cls with the index
include_cls = include_cls and (spec.get('cls', False) or cls._meta.get('index_cls', True))
@@ -795,16 +795,25 @@ class BaseDocument(object):
# ASCENDING from +
# DESCENDING from -
# GEO2D from *
# TEXT from $
# HASHED from #
# GEOSPHERE from (
# GEOHAYSTACK from )
# GEO2D from *
direction = pymongo.ASCENDING
if key.startswith("-"):
direction = pymongo.DESCENDING
elif key.startswith("*"):
direction = pymongo.GEO2D
elif key.startswith("$"):
direction = pymongo.TEXT
if key.startswith(("+", "-", "*", "$")):
elif key.startswith("#"):
direction = pymongo.HASHED
elif key.startswith("("):
direction = pymongo.GEOSPHERE
elif key.startswith(")"):
direction = pymongo.GEOHAYSTACK
elif key.startswith("*"):
direction = pymongo.GEO2D
if key.startswith(("+", "-", "*", "$", "#", "(", ")")):
key = key[1:]
# Use real field name, do it manually because we need field
@@ -827,7 +836,8 @@ class BaseDocument(object):
index_list.append((key, direction))
# Don't add cls to a geo index
if include_cls and direction is not pymongo.GEO2D:
if include_cls and direction not in (
pymongo.GEO2D, pymongo.GEOHAYSTACK, pymongo.GEOSPHERE):
index_list.insert(0, ('_cls', 1))
if index_list:

View File

@@ -637,14 +637,19 @@ class Document(BaseDocument):
:param key_or_list: a single index key or a list of index keys (to
construct a multi-field index); keys may be prefixed with a **+**
or a **-** to determine the index ordering
:param background: Allows index creation in the background
:param drop_dups: Was removed with MongoDB 3. The value will be
removed if PyMongo3+ is used
"""
index_spec = cls._build_index_spec(key_or_list)
index_spec = index_spec.copy()
fields = index_spec.pop('fields')
index_spec['drop_dups'] = drop_dups
# TODO: raise warning if dropdups given and remove with PyMongo3+
index_spec['background'] = background
index_spec.update(kwargs)
# TODO: ensure_index is deprecated
return cls._get_collection().ensure_index(fields, **index_spec)
@classmethod
@@ -688,6 +693,7 @@ class Document(BaseDocument):
if 'cls' in opts:
del opts['cls']
# TODO: ensure_index is deprecated in PyMongo 3+ and drop_dups removed
collection.ensure_index(fields, background=background,
drop_dups=drop_dups, **opts)
@@ -701,6 +707,7 @@ class Document(BaseDocument):
if 'cls' in index_opts:
del index_opts['cls']
# TODO: ensure_index is deprecated in PyMongo 3+
collection.ensure_index('_cls', background=background,
**index_opts)