from bson import ObjectId

news/2024/11/18 11:49:28/文章来源:https://www.cnblogs.com/pmna/p/18552248

ObjectId 是 MongoDB 中用于标识文档的唯一标识符(ID),由 BSON 库(bson)提供的一个类。以下是 ObjectId 的作用及其常用操作。


ObjectId 的作用

  1. 唯一标识文档
    • 每个存储在 MongoDB 中的文档都有一个 _id 字段,默认类型是 ObjectId
    • 它是 12 字节的值,由 MongoDB 自动生成,用来唯一标识一个文档。
  2. 文档查询和操作
    • 使用 ObjectId 可以高效地查询、更新或删除特定文档。
  3. 时间戳信息
    • ObjectId 包含文档创建时的时间戳,可以用于推断文档的创建时间。

ObjectId 的结构

ObjectId 是一个 12 字节(96 位)的值,由以下部分组成:

  • 前 4 字节:UNIX 时间戳(秒级)——文档创建时间。
  • 接下来的 5 字节:机器标识符(主机 ID 和进程 ID 的组合)。
  • 后 3 字节:随机计数器。

这种结构确保了其全局唯一性,同时提供了时间戳功能。


常见用法

1. 生成一个新的 ObjectId

from bson import ObjectId# 创建一个新的 ObjectId
new_id = ObjectId()
print(new_id)  # 输出: 例如 64eddb89ad14e44f5c6c9a1e

2. 转换字符串为 ObjectId

MongoDB 中 _id 通常存储为 ObjectId 类型,如果你有一个文档 ID 的字符串形式(如 "64eddb89ad14e44f5c6c9a1e"),可以将其转换为 ObjectId

id_str = "64eddb89ad14e44f5c6c9a1e"
object_id = ObjectId(id_str)
print(object_id)  # 输出: ObjectId('64eddb89ad14e44f5c6c9a1e')

3. 通过 ObjectId 查询文档

from mongoengine import Document, StringField
from bson import ObjectIdclass MyDocument(Document):name = StringField()# 查询文档
doc_id = "64eddb89ad14e44f5c6c9a1e"
result = MyDocument.objects(id=ObjectId(doc_id)).first()
print(result.name)

4. 获取 ObjectId 的时间戳

ObjectId 中提取时间戳,获取文档的创建时间。

oid = ObjectId("64eddb89ad14e44f5c6c9a1e")
print(oid.generation_time)  # 输出: 文档创建的时间,UTC 时区

5. 比较 ObjectId

可以直接比较两个 ObjectId,因为它们是可排序的。

oid1 = ObjectId("64eddb89ad14e44f5c6c9a1e")
oid2 = ObjectId("64eddb89ad14e44f5c6c9a1f")if oid1 < oid2:print("oid1 是更早生成的")

注意事项

  1. 与字符串的区别
    • 虽然可以将 _id 存储为字符串,但推荐使用默认的 ObjectId,因为它更高效且带有时间戳。
  2. 查询时的类型匹配
    • 如果 _idObjectId 类型,查询时需要确保传入的也是 ObjectId 类型,否则会导致查询不到结果。
  3. 时间戳的时区问题
    • ObjectId.generation_time 返回的是 UTC 时间,可能需要转换为本地时间。

适用场景

  • 默认主键
    • MongoDB 默认为每个文档生成一个 ObjectId,省去手动创建唯一标识的麻烦。
  • 全局唯一性
    • 在分布式系统中,可以使用 ObjectId 作为全局唯一标识。
  • 高效查询
    • ObjectId 是按时间排序的,因此在按时间范围查询文档时非常高效。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/836079.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

又稳又快!基于ByteHouse ELT构建高性能离/在线一体化数仓

近期,ByteHouse与某数字娱乐公司达成合作,双方聚焦高性能离/在线一体化数仓展开合作。近期,ByteHouse与某数字娱乐公司达成合作,双方聚焦高性能离/在线一体化数仓展开合作。随着自身领域迅速发展的同时,该数字娱乐公司需要更稳定、易用的数据基础服务,但该方面遇到多种挑…

js设置浏览器cookie

https://blog.csdn.net/x550392236/article/details/77651579

猫映射(Arnold变换),猫脸变换介绍与基于例题脚本的爆破

前置信息 http://www.jiamisoft.com/blog/index.php/7249-erzhituxiangjiamisuanfaarnold.html https://mp.weixin.qq.com/s/IbkAlyAPvbgMeNgqfwisTg Arnold变换 Arnold变换是V.J.Arnold在遍历理论的研究中提出的一种变换,原意为catmapping,俗称猫脸变换。Arnold变换直观、简…

伯索云学堂视频课件课程下载工具,如何在电脑端下载伯索云学堂视频课程课件资料PDF,PPT到本地?

一. 安装伯索云课程下载器 1.获取学无止下载器 https://www.xuewuzhi.cn/plaso_downloader 2.下载安装后,然后点击桌面快捷方式运行即可。 注意:杀毒软件可能会阻止外部exe文件运行,并将其当做成病毒,直接添加信任即可,本软件绝对没有木马病毒。 二. 使用说明 1.学无止下载…

一个自托管免费开源的人脸识别系统

大家好,今天给大家分享一个自托管免费开源的人脸识别系统CompreFace。CompreFace 是一个开源的人脸识别系统,由 Exadel 公司开发并维护。它提供了一个基于深度学习的解决方案,用于人脸检测、识别和验证。 CompreFace 的设计旨在简化人脸识别技术的使用,使得开发者无需深入理…

洛谷题单指南-二叉堆与树状数组-P3374 【模板】树状数组 1

原题链接:https://www.luogu.com.cn/problem/P3374 题意解读:树状数组模版:单点修改,区间求值。 解题思路: 树状数组-Binary Index Tree可以动态维护一组数,可以O(logn)的修改一个数,也可以O(logn)的计算一段区间的和。 思考一下朴素做法:如何修改一个数,计算区间和?…

11月16日,工信部人才交流中心 CUUG - PGCP / PGCM认证考试完成!

2024年11月16日,由工业和信息化部人才交流中心 与 北京神脑资讯技术有限公司共同举办的PostgreSQL管理员岗位能力认证考试(PGCP中级/PGCM高级)完成。 中级PG认证专家-PGCP(PostgreSQL Certified Professional):是对PostgreSQL数据库技术能力的一种认可,达到了专家级别,…

manim边做边学--球体

Sphere类用于创建三维球体对象,它提供了丰富的参数和方法来定制球体的外观和行为。 球体在制作三维动画时,具有广泛的应用场景。 比如:展示几何概念:通过创建不同大小、颜色和透明度的球体,可以直观地展示几何中的体积、表面积等概念 物理模拟:在模拟物理现象(如重力、碰…

闵可夫斯基和

闵可夫斯基和 前言 部分图片来自 https://www.luogu.com.cn/article/mhp0aeub。 定义 对于两个向量集合 \(A,B\),它们的闵可夫斯基和为 \(\{ a+b | a \in A, b \in B\}\)。 求解 在 OI 中,我们一般研究凸包的闵可夫斯基和。 如图是两个凸包的闵可夫斯基和。本文来自博客园,作…

UNIAPP设置消息推送(v1.0),自定义铃声功能

目前项目需要开发一个物联网APP进行设备绑定、警情查看、统计分析、设备操作、自定义报警铃声等相关功能 采用的uniapp进行开发,功能其实都很简单就是调用SDK进行设备关联、数据的增删改查,逻辑清晰明了,没想到问题出在了消息推送这块, 消息推送-因为是uniapp进行开发所以采…

仓储和运输如何协同?项目管理在物流行业的应用

物流运输是现代经济的核心,覆盖了供应链的多个环节,从订单接收到仓储管理,再到运输配送,每一步都关系到效率和成本。然而,物流行业的复杂性也带来了管理难题,例如多部门协作不畅、运输计划不可控、资源分配不合理等。面对这些挑战,项目管理工具正逐步成为提升物流运输效…

6、oracle网络(监听)

oracle包含 1、软件 2、数据库 3、实例 4、监听(listener) 监听的特点 可以独立启动,就是说,数据库没有启动,监听可以启动;数据库启动,监听也可以不启动;数据库启动,监听也启动 监听和数据库是独立分开的数据库的整个网络结构图解: 1、数据库有数据库的名字:dbname;…