昨日、MongoDB で奇妙な体験をしました。私はツイストとtxmongoを使用しています - mongodb の非同期ドライバー (pymongo に似ています)。
データを受信してmongodbに入れるレストサービスがあります。1 つのフィールドはミリ秒単位の 13 桁のタイムスタンプです。
まず第一に、Pythonでミリ秒のタイムスタンプをPythonの日時に変換する簡単な方法はありません。私はこのようなものになりました:
def date2ts(ts):
return int((time.mktime(ts.timetuple()) * 1000) + (ts.microsecond / 1000))
def ts2date(ts):
return datetime.datetime.fromtimestamp(ts / 1000) + datetime.timedelta(microseconds=(ts % 1000))
問題は、データをmongodbに保存し、datetimeを取得して、関数を使用してtimestampに戻すと、ミリ秒単位で同じ結果が得られないことです。
なぜそれが起こっているのか理解できませんでした。Datetime は ISODate オブジェクトとして mongodb に保存されます。シェルからクエリを実行しようとしましたが、実際には 1 秒または数ミリ秒の違いがあります。
質問 1: なぜこれが起こっているのか誰か知っていますか?
しかし、これで終わりではありません。datetime を使用せず、タイムスタンプをできるだけ長く保存することにしました。その前に、コレクションからすべてのデータを削除しました。同じフィールドを日付ではなく長さだけ保存しようとすると、シェルでISODateとして表されることに非常に驚きました。そして、取得すると、まだ数ミリ秒の違いがありました.
コレクションとインデックスを削除しようとしました。役に立たなかったとき、データベース全体を削除しようとしました。役に立たなかったとき、データベース全体を削除してmongodを再起動しようとしました。そして、この後、Longとして保存し始めたと思います。
質問 2: なぜこれが起こっているのか誰か知っていますか?
ありがとうございました!