mongodb を使用してアプリケーションを作成しましたが、_id フィールドを設定していないため、デフォルトで mongo の objectId フィールドを使用しています。
現在、_id フィールドを生成できません。
mongo が特定のコレクションの objectId を生成する方法をカスタマイズする方法はありますか?
一意性を確保するために、これを UNIX タイムスタンプ オブジェクトに変更したいと考えています。
mongo が特定のコレクションの objectId を生成する方法をカスタマイズできないことは確かです (ソース コードを変更してから再構築する以外に)。ただし、_id フィールドは変更できます。これは、これを示す簡単で汚いコード スニペットです。
import pymongo
import time
conn = pymongo.MongoClient()
def check_uniqueness(id):
if conn['test']['test'].find({'_id':id}.count() > 1
return False
return True
def main()
while True:
proposed_id = time.time()
if check_uniqueness(proposed_id):
conn['test']['test'].insert({'_id': proposed_time})
break
タイムスタンプを使用することは、クロックが同期されていない複数のマシンから mongo インスタンスに接続している場合は特に、最善の方法ではない可能性があります。特に mongo インスタンスが大量の書き込みを行っている場合は、非常に簡単に競合が発生する可能性があります。
一意性を確保するために、これを UNIX タイムスタンプ オブジェクトに変更したいと考えています。
Unix タイムスタンプは、ウィキペディアで述べられているように、あなたが思っているほど一意ではありません (実装が異なる場合があります): http://en.wikipedia.org/wiki/Unix_time
Unix 時間、または POSIX 時間は、協定世界時 (UTC) の 00:00:00 から経過した秒数として定義される、瞬間を記述するためのシステムです。
UNIX タイムスタンプの粒度が原因で、ObjectId に追加の inc コンパウンドが含まれます (inc が増加したのと同じ秒に操作が発生した場合)。実際、大規模なデータベースで inc が増加することは非常に一般的です。
タイムスタンプのみを使用すると、問題に直面します。
代わりに、次のいずれかをお勧めします。
mongo が特定のコレクションの objectId を生成する方法をカスタマイズする方法はありますか?
@the_man_slim による回答が Python で示されているように、独自の ID を挿入することはできますが、_id
フィールドを更新することはできないので注意してください。