0

我正在使用 django-nonrel 和 mongodb 开发应用程序。我知道对象 id 以对象创建插入时间的时间戳开始。因此可以根据 _id 字段进行时间范围查询。

如何根据 python 或 django 中的给定时间生成最小的 object_id?

4

2 回答 2

0
from bson.objectid import ObjectId
import time

def get_minimal_object_id_for_int_timestamp(int_timestamp=None):
    if not int_timestamp:
        int_timestamp=int(time.time())
    return ObjectId(hex(int(int_timestamp))[2:]+'0000000000000000')

def get_int_timestamp_from_time_string(time_string=None): 

    # format "YYYY-MM-DD hh:mm:ss" like '2012-01-05 13:01:51'
    if not time_string:
        return int(time.time())
    return int(time.mktime(time.strptime(time_string, '%Y-%m-%d %H:%M:%S')))

def get_minimal_object_id_for_time_string(time_string=None):
    return get_minimal_object_id_for_int_timestamp(get_int_timestamp_from_time_string(time_string=time_string))

我终于找到了解决方案。希望对其他人有所帮助。

于 2013-02-07T07:29:18.977 回答
0

这是 OP 在此处提供的另一个答案的更多 Pythonic 版本,以及文档:

from bson.objectid import ObjectId
import datetime

def datetime_to_objectid(dt):
    # ObjectId is a 12-byte BSON type, constructed using:
    # a 4-byte value representing the seconds since the Unix epoch,
    # a 3-byte machine identifier,
    # a 2-byte process id, and
    # a 3-byte counter, starting with a random value.

    timestamp = int((dt - datetime.datetime(1970,1,1)).total_seconds())
    time_bytes = format(timestamp, 'x') #4 bytes
    return ObjectId(time_bytes+'00'*8) #+8 bytes

但是,从 pymongo 1.6 版开始,执行以下操作会更加优雅:

from bson.objectid import ObjectId

ObjectId.from_datetime(dt)
于 2016-01-31T12:22:44.807 回答