Làm cách nào để lấy id duy nhất trong MongoDB?

Tôi đang làm việc để tạo hệ thống Quản lý quan hệ khách hàng. Tôi cần tạo một ID duy nhất gồm tám chữ số cho một khách hàng cụ thể. Làm cách nào để đạt được điều đó trong Javascript với Mongodb?

- stackoverflow. com

ghi bàn. 0

Trước hết, bạn cần biết rằng khả năng đụng độ chỉ với 8 số là hơi cao, vì vậy bạn cần cẩn thận với điều đó nếu không muốn trùng id

nhưng bạn có thể sử dụng cái này

Math.floor(10000000 + Math.random() * 90000000)

Tôi khuyên bạn nên sử dụng UUID, nhưng bạn biết nhiều hơn về dự án của mình

ghi bàn. 1

Thật khó hoặc không thể trả lời câu hỏi này nếu không có thêm thông tin về các trường hợp sử dụng

Nói một cách đơn giản, bạn có thể sử dụng số tăng tự động và điều đó sẽ cung cấp cho bạn một id duy nhất lên tới 99.999.999

Nhưng nếu bạn muốn đi xa hơn, bạn có thể lưu trữ nó dưới dạng cấu trúc 26 bit lên tới 67108863 trong cơ số 10

Từ đó bạn phải xác định ý nghĩa của định danh của bạn

Giả sử bạn dự định có 4 máy chủ có thể nhận dạng

Bạn có thể đặt 2 bit đầu tiên thành id máy chủ. vì vậy máy chủ 1 sẽ đặt 00 và máy chủ 4 sẽ đặt 11

Điều này để lại cho bạn 24 bit để xác định

Vì vậy, bây giờ bạn có thể muốn thiết lập một số chi tiết. Giống như đặt năm ở định dạng YY vì bạn có thể không mong đợi ứng dụng này tồn tại qua năm 2100

6 bit sẽ cho phép chúng tôi tạo một số lên tới 64 để chúng tôi có thể sử dụng thêm một bit để đếm tới 128

Vậy năm 2020 sẽ là "001 0100"

Chúng tôi chỉ có 12 tháng một năm nên nó phù hợp với 4 bit

Tháng mười là tháng thứ mười nên số 9 hoặc "1001" trong hệ nhị phân

Chúng tôi có tối đa 31 ngày mỗi tháng nên 5 bit sẽ đủ tốt

Hôm nay là ngày 15 của tháng nên số 14 trong hệ nhị phân là "01110"

Cho đến nay, chúng tôi đã sử dụng 18 bit để tạo 1 id mỗi ngày và điều đó khiến chúng tôi có thêm 8 bit

server id | year   | month  | day   
2 bits    | 7 bits | 4 bits | 5 bits

Với 9 bit còn lại, bạn có thể tạo tối đa 256 id mỗi ngày trên 4 máy chủ khác nhau mà không gặp rủi ro khi tạo xung đột

Vì vậy, nếu bạn sử dụng số lượng id tối đa, mỗi ngày bạn có thể tạo tối đa 1024 id mỗi ngày. Nó không nhiều nhưng nó có thể đủ tốt tùy theo nhu cầu

Sử dụng phương pháp đó, id đầu tiên trên máy chủ 0 cho ngày hôm nay có thể trông như thế này

00 | 001 0100 | 1001 | 0 1110 | 0 0000 0001

Hoặc trong cơ sở 10. "0539 7505"

Vì vậy, nếu không biết các yêu cầu của bạn, thì không thể tìm ra một mã định danh tốt hơn có ý nghĩa nào đó. Rõ ràng là các phương pháp dựa trên thời gian làm giảm đáng kể số lượng bit có thể được sử dụng. Bởi vì những ngày trong quá khứ là những id không thể được sử dụng và thật không may với 4 bit dữ liệu cho các tháng, các số 13,14,15 không bao giờ được sử dụng và không có ý nghĩa và chỉ đơn giản là danh sách mãi mãi

Trong trường hợp của năm, chúng tôi thậm chí có thể tiết kiệm một chút và nói rằng thay vì 7 bit, chúng tôi sẽ sử dụng 6 bit cho đến 64 và số chỉ là 2020 + number nên năm 2020 sẽ là "00 0000" Vì vậy, bạn chỉ cần lấy current year - 2020 để tìm

Thay vì sử dụng ngày tháng, bạn có thể sử dụng bất kỳ thứ gì có ý nghĩa để tạo mã định danh duy nhất. Nếu bạn sử dụng các số ngẫu nhiên, không những id không có ý nghĩa mà còn có nguy cơ tạo xung đột

Cuối cùng, tại sao không sử dụng đơn giản là sử dụng một ObjectId được tạo bởi mongodb?

Trong MongoDB, khá dễ dàng và hiệu quả để tương tác với các tài liệu bằng cách sử dụng các ID duy nhất. Phương thức find() của MongoDB chứa một danh sách mở rộng các toán tử và lệnh được hỗ trợ giúp truy xuất tài liệu ở dạng tinh chỉnh. ID duy nhất có thể được sử dụng với phương thức find() để lấy tài liệu dựa trên ID của chúng. Bằng cách làm theo hướng dẫn này, người dùng Mongo có thể lấy tài liệu bằng cách sử dụng id của những tài liệu đó trong phương thức find(). Ngoài ra, để hiểu rõ hơn, một vài ví dụ được cung cấp cho thấy cách sử dụng phương thức “find() by id” trong MongoDB

MongoDB là một cơ sở dữ liệu NoSQL hoạt động với các bộ sưu tập và tài liệu. Mỗi tài liệu được tạo trên MongoDB có một thuộc tính ID đối tượng duy nhất. Vì vậy, khi tạo tài liệu mà không cần nhập ID, tài liệu sẽ được tạo bằng ID được tạo tự động

Ai tạo ID?

Khi điền thuộc tính của tài liệu, chúng ta không nhất thiết phải nhập ID đối tượng. Nhưng khi chúng ta tham khảo MongoDB sau khi tạo một tài liệu, nó sẽ có ID đối tượng giống như thế này

{ 
“_id”: “5f1819229fdf8a0c7c2d8c36”
}

Điều này giúp chúng tôi tạo tài liệu trong MongoDB dễ dàng hơn nhiều và tiết kiệm rất nhiều thời gian. ID đối tượng trong các tài liệu trong MongoDB được tạo bởi trình điều khiển MongoDB, nói chuyện với MongoDB. Vì vậy, điều này mang lại rất nhiều lợi thế

  • Bạn không cần đợi MongoDB tạo mã định danh duy nhất mới
  • Các ứng dụng của MongoDB có khả năng mở rộng cao
  • Bạn có thể tạo một số phiên bản của MongoDB
  • Không cần phải nói chuyện với một nơi trung tâm để có được một mã định danh duy nhất

Thuộc tính của ID đối tượng

ID đối tượng dài 24 ký tự với hai ký tự chiếm tối đa một byte, do đó chứa tổng cộng 12 byte. Đây là những gì 12 byte của ID đối tượng cho chúng ta biết

dấu thời gian

Bốn byte đầu tiên của ID đối tượng biểu thị dấu thời gian khi tài liệu được tạo. Chúng tôi tránh phải tạo một thuộc tính riêng trong tài liệu, chẳng hạn như created-at và do đó có thể tiết kiệm thời gian và có các dòng mã được tối ưu hóa

Do sự đóng góp của dấu thời gian cho ID đối tượng, chúng tôi có thể có được thời gian khi tài liệu được tạo bằng cách chỉ tham khảo ID. Do đó, khi truy vấn dữ liệu, chúng tôi không cần một phương pháp khác để sắp xếp tài liệu theo dấu thời gian

Bạn có thể lấy dấu thời gian của một đối tượng bằng cách sử dụng các lệnh sau

const mongoose = require('mongoose');// Create object Id on memory
const id = new mongoose.Types.ObjectId();
// Get timestamp
console.log(id.getTimestamp());

mã định danh máy

Ba byte tiếp theo đại diện cho mã định danh máy (i. e. máy mà tài liệu được tạo trên đó). Giả sử hai tài liệu được tạo cùng lúc trên các máy khác nhau. Ba byte này sẽ khác nhau, làm tăng thêm tính duy nhất của ID đối tượng

định danh quy trình

Hai byte tiếp theo đại diện cho định danh quy trình (i. e. quy trình trong máy mà tài liệu được tạo trên đó). Giả sử hai tài liệu được tạo cùng lúc trên cùng một máy nhưng với các quy trình khác nhau. Hai byte này sẽ khác nhau, làm tăng thêm tính duy nhất của ID đối tượng

Phản đối

Ba byte cuối cùng đại diện cho một bộ đếm. Bộ đếm này là một số tăng tự động tương tự như các biến bộ đếm khác trong cơ sở dữ liệu SQL và NoSQL, làm cho ID đối tượng trở thành duy nhất (trong SQL, điều này có thể cản trở khả năng mở rộng). Giả sử hai tài liệu được tạo cùng lúc trên cùng một máy và trên cùng một quy trình. Các byte bộ đếm sẽ khác nhau, góp phần tạo nên tính duy nhất của ID đối tượng

Vấn đề ID đối tượng

Trong MongoDB, một vấn đề phát sinh với bộ đếm trong ID đối tượng có thể hạn chế tính duy nhất của nó

ID đối tượng chỉ là duy nhất miễn là bộ đếm không tràn

Sự cố tràn bộ đếm xảy ra khi bộ đếm đã đạt đến công suất tối đa, dẫn đến các tài liệu có cùng ID đối tượng. Do đó, ID đối tượng gần như là duy nhất nhưng không phải là duy nhất 100%

Đây là lý do tại sao. Bộ đếm đang được phân bổ ba byte. Điều này có nghĩa là nó có khả năng đại diện cho tới 16 triệu số. Nếu nhiều tài liệu đó được tạo cùng lúc, trên cùng một máy và cùng một quy trình, thì hai tài liệu có thể chia sẻ cùng một ID đối tượng

Sử dụng Mongoose

Khi xây dựng ứng dụng bằng Node. js và Express. js, chúng tôi sử dụng cầy mangut. Mongoose là một sự trừu tượng hóa trên trình điều khiển MongoDB. Do đó, khi tạo tài liệu, cầy mangut sẽ nói chuyện với trình điều khiển MongoDB để tạo ID đối tượng mới

Tạo ID đối tượng

// create an object id on memory - Not on DB!const mongoose = require('mongoose');const id = mongoose.Types.ObjectId();
console.log(id);
// output -> 5f1819229fdf8a0c7c2d8c36

Xác thực ID đối tượng

Với cầy mangut, bạn cũng có thể xác thực tĩnh ID đối tượng bằng cách sử dụng thuộc tính isValid

Phần kết luận

ID đối tượng MongoDB là duy nhất trừ khi đạt đến một kịch bản nhất định (đã thảo luận ở trên). Do đó, với tư cách là nhà phát triển phần mềm, chúng ta nên xem xét quy mô và độ phức tạp của hệ thống để đánh đổi giữa ID được tạo tự động và ID đối tượng tùy chỉnh

Cách tiếp cận hoàn toàn do bạn quyết định. Để biết thêm thông tin về ID đối tượng MongoDB, bạn có thể tham khảo tài liệu chính thức của MongoDB và Mongoose

Tôi hy vọng câu chuyện này đã giáo dục bạn về tính duy nhất và độ tin cậy của ID đối tượng trong MongoDB. Hãy vui vẻ học tập và tận hưởng mã hóa

Làm cách nào để nhận các giá trị duy nhất trong MongoDB?

Trong MongoDB, phương thức differ() tìm các giá trị riêng biệt cho một trường nhất định trong một tập hợp và trả về kết quả trong một mảng. Phải mất ba tham số đầu tiên là trường trả về các giá trị riêng biệt và các tham số khác là tùy chọn.

Làm cách nào để tìm id trong MongoDB?

MongoDB cung cấp một hàm có tên findById() được sử dụng để truy xuất tài liệu khớp với 'id' do người dùng chỉ định. Để sử dụng findById trong MongoDB, hàm find() được sử dụng. Nếu không tìm thấy tài liệu nào khớp với 'id' đã chỉ định, nó sẽ trả về giá trị rỗng.

MongoDB IDS độc đáo như thế nào?

Theo hướng dẫn của MongoDB, câu trả lời là có, theo mặc định, nó là duy nhất . MongoDB tạo chỉ mục _id, là chỉ mục duy nhất tăng dần trên trường _id, cho tất cả các bộ sưu tập khi bộ sưu tập được tạo. Bạn không thể xóa chỉ mục trên trường _id.

Làm cách nào để tạo _id trong MongoDB?

Tạo một ObjectId mới. Để tạo ID đối tượng mới theo cách thủ công trong MongoDB, bạn có thể khai báo ObjectId dưới dạng phương thức . Trong hình ảnh bên dưới, bạn có thể quan sát thấy rằng chúng ta đang khai báo một biến có phương thức ObjectId làm giá trị. Nó sẽ trả về một hệ thập lục phân duy nhất mà chúng ta có thể lưu trữ trong một biến có tên myObjectId.