0

mongodb を使用してアプリケーションを作成しましたが、_id フィールドを設定していないため、デフォルトで mongo の objectId フィールドを使用しています。

現在、_id フィールドを生成できません。

mongo が特定のコレクションの objectId を生成する方法をカスタマイズする方法はありますか?

一意性を確保するために、これを UNIX タイムスタンプ オブジェクトに変更したいと考えています。

4

2 に答える 2

1

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 インスタンスが大量の書き込みを行っている場合は、非常に簡単に競合が発生する可能性があります。

于 2013-08-01T20:17:16.017 に答える
1

一意性を確保するために、これを UNIX タイムスタンプ オブジェクトに変更したいと考えています。

Unix タイムスタンプは、ウィキペディアで述べられているように、あなたが思っているほど一意ではありません (実装が異なる場合があります): http://en.wikipedia.org/wiki/Unix_time

Unix 時間、または POSIX 時間は、協定世界時 (UTC) の 00:00:00 から経過した秒数として定義される、瞬間を記述するためのシステムです。

UNIX タイムスタンプの粒度が原因で、ObjectId に追加の inc コンパウンドが含まれます (inc が増加したのと同じ秒に操作が発生した場合)。実際、大規模なデータベースで inc が増加することは非常に一般的です。

タイムスタンプのみを使用すると、問題に直面します。

代わりに、次のいずれかをお勧めします。

  • 使いやすい ID とそうでない ID の 2 つの ID を格納
  • それを置き換えるために何か他のものを探してください。私はあなたのシナリオを十分に知りません。

mongo が特定のコレクションの objectId を生成する方法をカスタマイズする方法はありますか?

@the_man_slim による回答が Python で示されているように、独自の ID を挿入することはできますが、_idフィールドを更新することはできないので注意してください。

于 2013-08-01T20:59:23.680 に答える