MongoDB中ObjectId获取时间

本文介绍了MongoDB中ObjectId的组成及如何从中提取时间信息。ObjectId由时间戳、机器标识码、进程ID和随机数组成,确保了文档的唯一性。文中详细讲解了使用不同编程语言(如JavaScript和Python)实现时间提取的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、ObjectId组成

ObjectId 是一个12字节 BSON 类型数据,有以下格式:

  • 前4个字节表示时间戳
  • 接下来的3个字节是机器标识码
  • 紧接的两个字节由进程id组成(PID)
  • 最后三个字节是随机数。

MongoDB中存储的文档必须有一个"_id"键。这个键的值可以是任何类型的,默认是个ObjectId对象。
在一个集合里面,每个文档都有唯一的"_id"值,来确保集合里面每个文档都能被唯一标识。
MongoDB采用ObjectId,而不是其他比较常规的做法(比如自动增加的主键)的主要原因,因为在多个 服务器上同步自动增加主键值既费力还费时。

二、从ObjectId中获取时间

算法:取id的前八位,按16进制转10进制,再乘上1000

1、网页上直接获取

  • 按“F12”进入开发者模式
    或者右键找到检查进入
    在这里插入图片描述
  • 找到console控制台输出
  • 取ObjectId前8位进行转换
eg:
//ObjectId("5c1c3db7937b4f141c2301e0")
//取前8位
new Date(Number(parseInt("5c1c3db7", 16).toString() + '000'));

2、Javascript实现

function time2id(time) {
    return mongoose.Types.ObjectId((~~(+time/1000)).toString(16) + '0'.repeat(16));
}
function id2time(id) {
    return new Date(parseInt(id.toString().substring(0, 8), 16) * 1000);
}

> id2time("5b6907878e3f488d10cd2f36")
< Tue Aug 07 2018 10:44:23 GMT+0800 (中国标准时间)

3、Python实现

def id2time(object_id):
    timeStamp = int(object_id[:8], 16)
    return time.strftime("%Y-%m-%d %H:%M:%S", time.localtime(timeStamp))

In [20]: id2time(a)
Out[20]: '2018-08-07 10:44:23'
在C#中,连接MongoDB并使用`ObjectId`进行查询通常涉及到以下几个步骤: 1. 安装依赖:首先需要安装MongoDB的驱动程序,如MongoDB.Driver。你可以通过NuGet包管理器添加`Microsoft.Extensions.DependencyInjection`和`MongoDB.Bson`等包。 ```csharp using Microsoft.Extensions.DependencyInjection; using MongoDB.Driver; ``` 2. 配置连接:创建一个`IMongoClientSettings`实例,指定数据库服务器地址和端口。如果使用的是连接字符串,可以直接解析。 ```csharp var connectionString = "mongodb://localhost:27017"; var clientSettings = new MongoClientSettings(connectionString); var client = new MongoClient(clientSettings); ``` 3. 获取数据库和集合:选择你要操作的数据库和集合,可以使用`IMongoDatabase`和`IMongoCollection<T>`。 ```csharp var databaseName = "your-database-name"; var collectionName = "your-collection-name"; var database = client.GetDatabase(databaseName); var collection = database.GetCollection<BsonDocument>(collectionName); ``` 4. 使用ObjectId查询:当你有`ObjectId`作为查询条件时,可以在`FindOneAndUpdate`, `FindOneAndDelete`, 或者`FindOneAndReplace`等方法中直接使用。 ```csharp Guid idToFind = ObjectId.Parse("your-object-id-guid"); var filter = Builders<BsonDocument>.Filter.Eq("_id", idToFind); var queryResult = collection.Find(filter).FirstOrDefault(); ``` 这里假设你的文档有一个名为 `_id` 的字段存储`ObjectId`,`filter`是一个筛选器表达式,用于匹配特定的`ObjectId`。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值