通过UUID在MongoDB中查找文档(将ObjectId转换为UUID)

尤金·M

我必须通过UUID在MongoDB中找到文档,但是文档与ObjectId一起存储。如何将UUID转换为ObjectId,反之亦然?我使用python和pymongo进行查询处理。

我发现只有一个提到此问题:

https://gist.github.com/enaeseth/5768348 -

有一个Python脚本将ObjectID转换为UUID。但是它不能正常工作。例如,它返回'f940bd00-55c3-11e3-a447-00e4b0ce16e9'而不是'f940bd03-55c3-11e3-a4b0-ce16e9596447'when '52933322e4b0ce16e9596447'(我有要测试的相对UUID和ObjectId的示例)。

您能帮我找到其他解决方案或修改此脚本吗?非常感谢。

尤金·M

将ObjectId转换为UUID

import datetime as dt
from bson import ObjectId
from uuid import UUID


class UTC(dt.tzinfo):
    ZERO = dt.timedelta(0)

    def utcoffset(self, dt):
        return self.ZERO

    def tzname(self, dt):
        return 'UTC'

    def dst(self, dt):
        return self.ZERO

UTC = UTC()
UUID_1_EPOCH = dt.datetime(1582, 10, 15, tzinfo=UTC)
UUID_TICKS_PER_SECOND = 10000000


def unix_time_to_uuid_time(dt):
    return int((dt - UUID_1_EPOCH).total_seconds() * UUID_TICKS_PER_SECOND)


def object_id_to_uuid(object_id):
    """
    Converts ObjectId to UUID

    :param object_id: some ObjectId
    :return: UUID
    """

    str_object_id = str(object_id)

    b = []
    for i in [0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22]:
        b.append(int(str_object_id[i:i+2], 16))

    generation_time = ObjectId(str_object_id).generation_time.astimezone(UTC)
    time = unix_time_to_uuid_time(generation_time)
    time |= (b[4] >> 6) & 0x3

    most_sig_bits = str(hex(0x1000 | time >> 48 & 0x0FFF
                            | time >> 16 & 0xFFFF0000
                            | time << 32))[9:]

    least_sig_bits = str(hex(2 << 62
                             | (b[4] & 0x3F) << 56 | (b[5] & 0xFF) << 48
                             | (b[6] & 0xFF) << 40 | (b[7] & 0xFF) << 32
                             | (b[8] & 0xFF) << 24 | (b[9] & 0xFF) << 16
                             | (b[10] & 0xFF) << 8 | b[11] & 0xFF))[2:]

    return UUID('%s-%s-%s-%s-%s' % (most_sig_bits[:8], most_sig_bits[8:12], most_sig_bits[12:16],
                               least_sig_bits[0:4], least_sig_bits[4:]))

将UUID转换为ObjectId

import datetime as dt
from bson import ObjectId
import pytz


def get_timestamp_from_uuid(uuid_object):

    generation_time = dt.datetime.utcfromtimestamp((uuid_object.time - 0x01b21dd213814000) * 100 / 1e9)
    generation_time = generation_time.replace(tzinfo=pytz.UTC)

    return int(generation_time.timestamp())


def get_timestamp_from_object_id(object_id):

    generation_time = object_id.generation_time
    return int(generation_time.timestamp())


def return_decimal_bytes(binary):

    binary = binary[2:]
    rest = len(binary) % 8

    if rest != 0:
        binary = '0'*(8 - rest) + binary
    bytes = {}

    for i in range(0, len(binary)//8):
        bytes[i] = binary[:8]
        binary = binary[8:]

    return bytes


def uuid_to_object_id(uuid_object):
    """
    Converts UUID to ObjectId

    :param uuid_object: UUID
    :return: ObjectId
    """

    uuid_to_bin = bin(int(uuid_object))
    parts_of_uuid = return_decimal_bytes(uuid_to_bin)

    timestamp_of_uuid = hex(get_timestamp_from_uuid(uuid_object))
    timestamp_of_uuid = timestamp_of_uuid.replace('0x', '')

    uuid_time = uuid_object.time

    fourth = int(parts_of_uuid[8], 2) & 0x3F | (uuid_time << 6)
    fourth = str(hex(fourth))[-2:]

    fifth = str(hex(int(parts_of_uuid[9], 2)))
    sixth = str(hex(int(parts_of_uuid[10], 2)))
    seventh = str(hex(int(parts_of_uuid[11], 2)))
    eighth = str(hex(int(parts_of_uuid[12], 2)))
    ninth = str(hex(int(parts_of_uuid[13], 2)))
    tenth = str(hex(int(parts_of_uuid[14], 2)))

    try:
        eleventh = str(hex(int(parts_of_uuid[15], 2)))
    except Exception as e:
        print(e)
        eleventh = str(hex(1))

    def rep(el):
        if len(el) <= 3:
            return el.replace('x', '')
        else:
            return el.replace('0x', '')

    res = rep(fifth) + rep(sixth) + rep(seventh) + rep(eighth) + rep(ninth) + rep(tenth) + rep(eleventh)

    return ObjectId(timestamp_of_uuid + fourth + res)

参考

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何通过MongoDb Shell将字符串字段转换为对象数组中的ObjectId?

来自分类Dev

将ByteArray转换为UUID Java

来自分类Dev

PostgreSQL:将UUID转换为OID

来自分类Dev

如何将Mongodb文档中的数组转换为JsonArray

来自分类Dev

休眠:无法通过UUID查找

来自分类Dev

如何通过ObjectId查找文档?

来自分类Dev

将CBPeripheral的UUID转换为字符串格式:

来自分类Dev

如何将UUID转换为base64?

来自分类Dev

MySQL将bigint转换为UUID的存储过程

来自分类Dev

将python uuid哈希码转换为php

来自分类Dev

cassandra将UUID转换为Year month日期

来自分类Dev

将Int64转换为UUID

来自分类Dev

将 UUID 转换为/从 BigInteger 时出现 BufferUnderflowException

来自分类Dev

如何转换为ObjectId并在MongoDB查找上匹配日期?

来自分类Dev

将uuid转换为字节,这在使用UUID.nameUUIDFromBytes(b)时有效

来自分类Dev

如何将蓝牙16位服务UUID转换为128位UUID?

来自分类Dev

将PostgreSQL bytea存储的serialized-java-UUID转换为postgresql-UUID

来自分类Dev

流星-通过Mongo ObjectId从集合中查找文档

来自分类Dev

EF Core-在PostgreSQL 13中将列类型从varchar更改为uuid:无法自动将列强制转换为uuid类型

来自分类Dev

如何使用 nodejs 通过 objectId 和 mongodb 中的另一个字段查找文档?

来自分类Dev

如何将$ project ObjectId转换为mongodb中的字符串值?

来自分类Dev

如何使用环回和mongodb将嵌套对象中的属性强制转换为ObjectId?

来自分类Dev

如何使用环回和mongodb将嵌套对象中的属性强制转换为ObjectId?

来自分类Dev

Mongo和Node.js:使用UUID(GUID)通过_id查找文档

来自分类Dev

如何将保存在字节数组中的UUID转换为字符串(C ++)

来自分类Dev

MongoDB:如何通过嵌套文档中的ID查找文档

来自分类Dev

通过相同的objectID查找多个文档

来自分类Dev

在 PHP 中从 MongoDB 获取 UUID

来自分类Dev

Mongoose uuid 插入的 ObjectId

Related 相关文章

  1. 1

    如何通过MongoDb Shell将字符串字段转换为对象数组中的ObjectId?

  2. 2

    将ByteArray转换为UUID Java

  3. 3

    PostgreSQL:将UUID转换为OID

  4. 4

    如何将Mongodb文档中的数组转换为JsonArray

  5. 5

    休眠:无法通过UUID查找

  6. 6

    如何通过ObjectId查找文档?

  7. 7

    将CBPeripheral的UUID转换为字符串格式:

  8. 8

    如何将UUID转换为base64?

  9. 9

    MySQL将bigint转换为UUID的存储过程

  10. 10

    将python uuid哈希码转换为php

  11. 11

    cassandra将UUID转换为Year month日期

  12. 12

    将Int64转换为UUID

  13. 13

    将 UUID 转换为/从 BigInteger 时出现 BufferUnderflowException

  14. 14

    如何转换为ObjectId并在MongoDB查找上匹配日期?

  15. 15

    将uuid转换为字节,这在使用UUID.nameUUIDFromBytes(b)时有效

  16. 16

    如何将蓝牙16位服务UUID转换为128位UUID?

  17. 17

    将PostgreSQL bytea存储的serialized-java-UUID转换为postgresql-UUID

  18. 18

    流星-通过Mongo ObjectId从集合中查找文档

  19. 19

    EF Core-在PostgreSQL 13中将列类型从varchar更改为uuid:无法自动将列强制转换为uuid类型

  20. 20

    如何使用 nodejs 通过 objectId 和 mongodb 中的另一个字段查找文档?

  21. 21

    如何将$ project ObjectId转换为mongodb中的字符串值?

  22. 22

    如何使用环回和mongodb将嵌套对象中的属性强制转换为ObjectId?

  23. 23

    如何使用环回和mongodb将嵌套对象中的属性强制转换为ObjectId?

  24. 24

    Mongo和Node.js:使用UUID(GUID)通过_id查找文档

  25. 25

    如何将保存在字节数组中的UUID转换为字符串(C ++)

  26. 26

    MongoDB:如何通过嵌套文档中的ID查找文档

  27. 27

    通过相同的objectID查找多个文档

  28. 28

    在 PHP 中从 MongoDB 获取 UUID

  29. 29

    Mongoose uuid 插入的 ObjectId

热门标签

归档