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