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