MongoDB对象ID中的自定义日期

MongoDB对象ID中的自定义日期,mongodb,Mongodb,MongoDB将创建的时间戳存储在主键字段\u id ObjectId中。此字段已编制索引 我需要按日期(不是创建日期)存储和筛选文档,我想利用这个字段 如何使用自定义日期生成唯一的ObjectID?我应该这样做吗?或者我应该为我的日期创建另一个字段并编制索引。MongoDB在创建新文档时自动生成ObjectId并将其填充到文档的\u id字段中 根据MongoDB文档 ObjectId是一种12字节的BSON类型,具有以下结构: 表示自unix纪元以来秒数的前4个字节 接下来的3个字节是机器标

MongoDB将创建的时间戳存储在主键字段\u id ObjectId中。此字段已编制索引

我需要按日期(不是创建日期)存储和筛选文档,我想利用这个字段


如何使用自定义日期生成唯一的ObjectID?我应该这样做吗?或者我应该为我的日期创建另一个字段并编制索引。

MongoDB在创建新文档时自动生成ObjectId并将其填充到文档的\u id字段中

根据MongoDB文档

ObjectId是一种12字节的BSON类型,具有以下结构:

表示自unix纪元以来秒数的前4个字节

接下来的3个字节是机器标识符

接下来的2个字节由进程id组成

最后3个字节是一个随机计数器值

以下是生成ObjectId的代码片段

Object_id = ObjectId()
 Object_id = ObjectId("5349b4ddd2781d08c09890f4")
我们还可以为ObjectId的生成指定12字节的自定义id

Object_id = ObjectId()
 Object_id = ObjectId("5349b4ddd2781d08c09890f4")

对于希望为自定义时间戳创建新mongo objectId的用户,请使用以下mongoose库

const mongoose = require('mongoose');


let anyTimeInMillisecs = Date.now();
var thisTimeStamp = Math.floor(anyTimeInMillisecs / 1000);
var newObjId = new mongoose.Types.ObjectId(thisTimeStamp); //our custom object ID

也许您可以创建自定义主键,而主键又是主键+当前日期(或您需要的任何日期)的组合。然后,您可以断开主键并利用此字段。无论您要存储什么,它仍然是
\u id
,因此是主键。所以它是不可变的,你不能改变它,所以“创建日期”确实是一个合乎逻辑的选择,除非你有其他的“一次性”日期。如果这是一个您希望更改的属性,那么您最好在文档中定义另一个属性。\u id和我的自定义日期在创建后不会更改。罗宾的回答下面还有更多的问题。好的,有两种方法。1) 生成带有创建时间戳的默认mongodb objectid,然后编辑前四个字节。如果有很多objectid具有相同的前四个字节,它还会是唯一的吗?2) 生成我自己的objectid。但我不知道如何生成最后8个字节。哪条路更好?