MongoDB
 sql >> Cơ Sở Dữ Liệu >  >> NoSQL >> MongoDB

Nhận ID tài liệu được chèn lần cuối trong MongoDB với trình điều khiển Java

1. Tổng quan

Đôi khi, chúng ta cần ID của tài liệu mà chúng ta vừa chèn vào cơ sở dữ liệu MongoDB. Ví dụ:chúng tôi có thể muốn gửi lại ID dưới dạng phản hồi cho người gọi hoặc ghi nhật ký đối tượng đã tạo để gỡ lỗi.

Trong hướng dẫn này, chúng ta sẽ xem cách các ID được triển khai trong MongoDB và cách truy xuất ID của tài liệu mà chúng tôi vừa chèn vào bộ sưu tập thông qua chương trình Java.

2. ID của tài liệu MongoDB là gì?

Như trong mọi hệ thống lưu trữ dữ liệu, MongoDB cần một mã định danh duy nhất cho mỗi tài liệu được lưu trữ trong một bộ sưu tập. Mã định danh này tương đương với khóa chính trong cơ sở dữ liệu quan hệ.

Trong MongoDB, ID này bao gồm 12 byte:

  • giá trị dấu thời gian 4 byte biểu thị số giây kể từ kỷ nguyên Unix
  • một giá trị ngẫu nhiên 5 byte được tạo một lần cho mỗi quá trình. Giá trị ngẫu nhiên này là duy nhất cho máy và quá trình.
  • bộ đếm tăng dần 3 byte

ID được lưu trữ trong trường có tên _id và được tạo bởi khách hàng. Điều này có nghĩa là ID phải được tạo trước khi gửi tài liệu đến cơ sở dữ liệu. Về phía khách hàng, chúng tôi có thể sử dụng ID do trình điều khiển tạo hoặc tạo ID tùy chỉnh.

Chúng ta có thể thấy rằng các tài liệu được tạo bởi cùng một máy khách trong cùng một giây sẽ có chung 9 byte đầu tiên. Do đó, tính duy nhất của ID phụ thuộc vào bộ đếm trong trường hợp này. Bộ đếm cho phép khách hàng tạo hơn 16 triệu tài liệu trong cùng một giây.

Mặc dù nó bắt đầu bằng dấu thời gian, chúng ta nên cẩn thận rằng mã định danh không được sử dụng làm tiêu chí sắp xếp. Điều này là do các tài liệu được tạo trong cùng một giây không được đảm bảo sắp xếp theo ngày tạo, vì bộ đếm không được đảm bảo là đơn điệu. Ngoài ra, các máy khách khác nhau có thể có đồng hồ hệ thống khác nhau.

Trình điều khiển Java sử dụng một bộ tạo số ngẫu nhiên cho bộ đếm, bộ này không đơn điệu. Đó là lý do tại sao chúng ta không nên sử dụng ID do trình điều khiển tạo để sắp xếp theo ngày tạo.

3. ObjectId Lớp học

Giá trị nhận dạng duy nhất được lưu trữ trong ObjectId lớp cung cấp các phương thức thuận tiện để lấy dữ liệu được lưu trữ trong ID mà không cần phân tích cú pháp theo cách thủ công.

Ví dụ:đây là cách chúng tôi có thể lấy ngày tạo ID:

Date creationDate = objectId.getDate();

Tương tự như vậy, chúng tôi có thể truy xuất dấu thời gian của ID trong vài giây:

int timestamp = objectId.getTimestamp();

ObjectId class cũng cung cấp các phương thức để lấy bộ đếm, mã định danh máy hoặc mã định danh quy trình, nhưng tất cả chúng đều không được dùng nữa.

4. Truy xuất ID

Điều chính cần nhớ là, trong MongoDB, ứng dụng khách tạo mã định danh duy nhất của Tài liệu trước khi gửi nó đến cụm. Điều này trái ngược với trình tự trong cơ sở dữ liệu quan hệ. Điều này làm cho việc truy xuất ID này khá dễ dàng.

4.1. ID do trình điều khiển tạo

Cách chuẩn và dễ dàng để tạo ID duy nhất của Tài liệu là để người lái xe thực hiện công việc. Khi chúng tôi chèn một Tài liệu mới vào một Bộ sưu tập , nếu không _id trường tồn tại trong Tài liệu , trình điều khiển tạo một ObjectId mới trước khi gửi lệnh chèn đến cụm.

Mã của chúng tôi để chèn một Tài liệu mới vào Bộ sưu tập của bạn có thể trông giống như sau:

Document document = new Document();
document.put("name", "Shubham");
document.put("company", "Baeldung");
collection.insertOne(document);

Chúng tôi có thể thấy rằng chúng tôi không bao giờ chỉ ra cách ID phải được tạo.

Khi insertOne () trả về phương thức, chúng ta có thể lấy ObjectId đã tạo từ Tài liệu :

ObjectId objectId = document.getObjectId("_id");

Chúng tôi cũng có thể truy xuất ObjectId giống như một trường tiêu chuẩn của Tài liệu và sau đó truyền nó tới ObjectId :

ObjectId oId = (ObjectId) document.get("_id");

4.2. ID tùy chỉnh

Cách khác để truy xuất ID là tạo ID đó trong mã của chúng tôi và đưa ID đó vào Tài liệu giống như bất kỳ lĩnh vực nào khác. Nếu chúng tôi gửi một Tài liệu với một _id vào trình điều khiển, nó sẽ không tạo ra một trường mới.

Chúng tôi có thể yêu cầu điều này trong một số trường hợp chúng tôi cần ID của MongoDB Tài liệu trước khi chèn Tài liệu trong Bộ sưu tập .

Chúng tôi có thể tạo một ObjectId mới bằng cách tạo một phiên bản mới của lớp:

ObjectId generatedId = new ObjectId();

Hoặc, chúng ta cũng có thể gọi hàm get () tĩnh phương thức của ObjectId lớp:

ObjectId generatedId = ObjectId.get();

Sau đó, chúng tôi chỉ cần tạo Tài liệu của mình và sử dụng ID đã tạo. Để làm như vậy, chúng tôi có thể cung cấp nó trong Tài liệu hàm tạo:

Document document = new Document("_id", generatedId);

Ngoài ra, chúng ta có thể sử dụng put () phương pháp:

document.put("_id", generatedId);

Khi sử dụng ID do người dùng tạo, chúng tôi phải thận trọng tạo một ObjectId mới trước mỗi lần chèn, vì ID trùng lặp bị cấm. Các ID trùng lặp sẽ dẫn đến MongoWriteException với một thông điệp chính trùng lặp.

ObjectId lớp cung cấp một số hàm tạo khác cho phép chúng tôi thiết lập một số phần của mã định danh:

public ObjectId(final Date date)
public ObjectId(final Date date, final int counter)
public ObjectId(final int timestamp, final int counter)
public ObjectId(final String hexString)
public ObjectId(final byte[] bytes)
public ObjectId(final ByteBuffer buffer)

Tuy nhiên, chúng ta nên hết sức cẩn thận khi sử dụng các hàm tạo đó vì tính duy nhất của ID được cung cấp cho trình điều khiển hoàn toàn dựa vào mã của chúng ta. Chúng tôi có thể gặp lỗi khóa trùng lặp trong những trường hợp cụ thể sau:

  • nếu chúng ta sử dụng cùng một ngày (hoặc dấu thời gian) và kết hợp bộ đếm nhiều lần
  • Nếu chúng tôi sử dụng cùng một Chuỗi thập lục phân , byte mảng hoặc ByteBuffer vài lần

  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Tạo Chỉ mục không gian địa lý 2dsphere cho các truy vấn hình cầu trong MongoDB

  2. Làm thế nào để kết nối chính xác với cụm Atlas M0 (Bậc miễn phí) thông qua trình điều khiển Java?

  3. Làm cách nào để thực hiện truy vấn mảng id trong Mongoose?

  4. Cách sử dụng MongoDB Stitch trong ứng dụng Android

  5. nâng cấp mongodb