MongoDB ObjectId


MongoDB ObjectId

什么是ObjectId?

ObjectId是MongoDB中的一种特殊类型的数据类型,它是由12个字节的BSON(二进制JSON)组成的,用于标识MongoDB中的文档。

在MongoDB 3.2及以下的版本中,ObjectId是由一部分时间信息(4 bytes)+机器ID(3 bytes)+进程ID(2 bytes)+计数器(3 bytes)组成的。在MongoDB 3.4及以上的版本中,ObjectId的计数器部分变为了随机数,以提高并发性能和减少冲突。

ObjectId的作用

ObjectId的作用在于:

  1. 在MongoDB文档中唯一标识文档;
  2. 作为MongoDB集群分片中的均衡负载键值,支持哈希分片;
  3. 支持按插入时间排序的查询,因为ObjectId中包含时间信息;
  4. 支持在MongoDB中设置唯一索引,保证数据的唯一性。

如何使用ObjectId

在MongoDB中使用ObjectId非常简单,直接使用以下代码即可:

const ObjectId = require('mongodb').ObjectId;
const id = new ObjectId();
console.log(id);

其中require(‘mongodb’).ObjectId是从MongoDB官方库中导入ObjectId模块,通过new ObjectId()对象方法创建一个新的ObjectId实例。

我们可以将ObjectId作为MongoDB中文档的_id属性直接插入到集合中,例如:

const collection = db.collection('users');
collection.insertOne({ _id: id, name: 'John', age: 28 });

上述代码即可将_id为id,name为John,age为28的文档插入到名为users的集合中。

除了显示创建ObjectId外,当我们向MongoDB集合中插入一个新文档时,如果未指定_id属性,MongoDB会自动为该文档分配一个ObjectId,如下所示:

const collection = db.collection('users');
collection.insertOne({ name: 'John', age: 28 });

在上面的代码中,当插入新文档时,MongoDB会自动为该文档赋予一个新的ObjectId。

MongoDB ObjectId的特殊性质

由于ObjectId是一个十分特殊的数据类型,因此熟知其特殊性质是十分重要的。

  1. ObjectId是不可变的。我们无法像其他类型的数据那样直接改变ObjectId的值;
  2. ObjectId具有全局唯一性。MongoDB在创建ObjectId时,会给每个ObjectId对象添加一个计数器生成唯一性ID;
  3. ObjectId不是连续的。即使在相同的数据库中,由于ObjectId在不同机器上生成,也无法保证连续性;
  4. ObjectId是轻量的,只有12个字节,适合于在网络上传输和存储。

总结

ObjectId是MongoDB数据库中一种非常特殊和重要的数据类型,它在MongoDB中扮演了至关重要的角色。我们可以通过上述的代码来了解和使用ObjectId,同时我们需要高度重视ObjectId的全局唯一性和不变性。