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