Хех, я недавно хотел точно такую же вещь.
В итоге я дал каждому документу, которому нужен один «публичный идентификатор», который уникален (например, ObjectId), но это просто автоматически увеличивающееся число (так что потребуется некоторое время, прежде чем числа становятся огромными, и даже больше, если они закодированы в шестнадцатеричном формате). Таким образом, я могу использовать ObjectId для внутреннего использования (что, я подозреваю, быстрее) и искать внешние ссылки на документы, используя их открытый идентификатор.
Обратите внимание, что при создании этих общедоступных идентификаторов наблюдается небольшое снижение производительности, поскольку каждый из них требует атомарного обновления документа (поэтому вы должны использовать их только там, где они вам нужны).
Ключом к созданию числа с автоинкрементом является команда findAndModify
MongoDB , которая увеличивает значение и возвращает старое значение в одной атомарной операции.
Поскольку вы используете Python, и я тоже, вот код, который я сейчас использую (обратите внимание, что он еще не работает):
from pymongo import Connection
from pymongo.son import SON
db = Connection().mydatabase
PUBLIC_ID_COLLECTION = 'next_public_id'
def next_public_id():
result = db.command(SON({ 'findandmodify': PUBLIC_ID_COLLECTION },
query = { '_id': 'manager' },
update = { '$inc': { 'next_public_id': 1 } },
upsert = True # Insert if not already existing
))
manager = result['value']
return manager.get('next_public_id', 0)