MongoDB 的 默认主键 _id-ObjectId


ObjectId

在插入数据时,mongoDB 会自动生成"_id",默认生成的"_id"属于 ObjectId 对象,作用类似于身份证号用来标识每一条数据。

ObjectId("60f691e1904a142b6f1ed0d7")

ObjectId 是一个12字节(16进制) BSON 类型数据,格式分三部分组成4|5|3:

  • 4 个字节时间戳(秒数) :表示数据生成的时间,60f691e1 --> 1626771937(10进制) --> 2021-07-20T09:05:37.000Z(时间)
  • 5 个字节随机数 :904a142b6f
  • 3 个字节自增的计数器 :1ed0d7,有时一秒中内 插入多条数据

注意:两位16进制数就是一个字节(8位二进制)

一般操作:

id = ObjectId("60f691e1904a142b6f1ed0d7")

# 获取时间戳
id.getTimestamp()  ## 2021-07-20T09:05:37.000Z

# 字符串化
id.toString()  ## 60f691e1904a142b6f1ed0d7

# 根据id查找

# 等于
db.person.find({"_id": ObjectId("60f691e1904a142b6f1ed0d7")})

# 小于
db.person.find({"_id": {$lt: ObjectId("60f691e1904a142b6f1ed0d7")}})

# 有些时候要查某些时间段的数据,在有必要的时候直接将时间戳后面的数字直接改到最大值f , 再做比较
# 这样就忽略的其他数字的比较,只要时间在这一秒的数据都符合条件
# 例如,查找  2021-07-20T09:05:37 之前的数据(包含当前这一秒,即09:05:37 )
db.user.find({"_id": {$lt: ObjectId("60f691e1ffffffffffffffff")}})

# 有时也可以 将时间戳后面的数字直接改到最小值0,再做比较
# 例如,查找  2021-07-20T09:05:37 之后的数据(包含当前这一秒,即09:05:37 )
db.user.find({"_id": {$gt: ObjectId("60f691e10000000000000000")}})

在 java springboot 项目中的使用

@Data
@Document("person")
public class Person {

    @Id
    private String id;

    private String name;

    private int age;

    @Override
    public String toString() {
        return "Person{" +
                "id='" + id + '\'' +
                ", name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}

//导入包
import org.bson.types.ObjectId;

   @Test
    public void testObjectId() {
        Query query = new Query();
//        query.addCriteria(Criteria.where("id").lte(new ObjectId("60f691e1904a142b6f1ed0d7")));
        query.addCriteria(Criteria.where("id").lte(new ObjectId("60f691e1ffffffffffffffff")));

        List<Person> peopleList = mongoTemplate.find(query, Person.class);

        System.out.println("size: "+peopleList.size());

        if (peopleList.size() > 0) {
            peopleList.forEach(System.out::println);
        }
    }

springboot 连接配置 及 mongoTemplate 基本使用: https://www.cnblogs.com/zhanglw456/p/14659228.html

官网:https://docs.mongodb.com/v4.4/reference/method/ObjectId/


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM