יוצר מזהה אובייקט MongoDB - צור מזהים BSON ייחודיים
צור מזהי MongoDB ObjectID ייחודיים באופן מיידי עם הכלי המקוון החינמי שלנו. צור מזהי BSON תקפים בני 12 בתים לבדיקות, פיתוח ופעולות מסד נתונים. לא נדרשת התקנה.
יוצר מזהה אובייקט של MongoDB
תיעוד
מהו ObjectID של MongoDB?
ObjectID של MongoDB הוא ערך בגודל 12 בתים, ש-MongoDB מקצה כברירת מחדל לשדה _id של כל מסמך. הוא נכתב כ-24 תווים הקסדצימליים באותיות קטנות, לדוגמה 507f1f77bcf86cd799439011. כלי זה יוצר בין 1 ל-100 מזהי ObjectID תקפים בכל פעם, ישירות בדפדפן וללא צורך בחיבור למסד נתונים.
מבנה ObjectID של MongoDB
ObjectID מורכב משלושה חלקים, המוצבים זה אחר זה:
- חותמת זמן (4 בתים). מספר השניות מאז 1 בינואר 1970 (תחילת עידן Unix), המאוחסן כמספר ללא סימן בסדר בתים גדול. הוא מציין מתי ה-ObjectID נוצר. ארבעה בתים מכילים ערכים מ-0 עד 4,294,967,295, ולכן השדה חוזר ל-0 לאחר 7 בפברואר 2106, בשעה 06:28:15 לפי UTC.
- ערך אקראי (5 בתים). מספר שנבחר באקראי פעם אחת, כאשר תוכנית מתחילה לפעול. כל ObjectID שהתוכנית יוצרת לאחר מכן משתמש באותו ערך אקראי, ולכן מחשבים שונים אינם צריכים לתאם ביניהם.
- מונה (3 בתים). מספר שמתחיל בנקודה אקראית בין 0 ל-16,777,215 ועולה ב-1 עבור כל ObjectID חדש. אם הוא עובר את 16,777,215, הוא חוזר ל-0.
כאשר מציבים את החלקים זה אחר זה, הם נראים כך:
1timestamp (8 hex chars) + random value (10 hex chars) + counter (6 hex chars) = 24 hex chars
2דרייברים ישנים יותר של MongoDB בנו את החלק האמצעי ממזהה מחשב וממזהה תהליך, ולא ממספר אקראי. דרייברים נוכחיים, לרבות הלוגיקה שמאחורי כלי זה, משתמשים בערך אקראי אחד בגודל 5 בתים לכל תהליך.
תבנית ונוסחה של ObjectID ב-MongoDB
אין מאחורי ObjectID נוסחה אריתמטית, בניגוד לאחוז או לחישוב ריבית. הוא מורכב מהמרת שלושה מספרים לטקסט הקסדצימלי ומחיבורם זה אחר זה:
- קחו את הזמן הנוכחי בשניות מאז תחילת עידן Unix, כשהוא מוגבל לטווח 0 עד 4,294,967,295 כדי שיתאים לארבעה בתים. כתבו אותו כמספר הקסדצימלי בעל 8 ספרות.
- קחו את הערך האקראי הקבוע של התהליך, מספר מ-0 עד 2^40 פחות 1. כתבו אותו כמספר הקסדצימלי בעל 10 ספרות.
- קחו את הערך הנוכחי של המונה, מ-0 עד 16,777,215. כתבו אותו כמספר הקסדצימלי בעל 6 ספרות, ולאחר מכן הגדילו את המונה ב-1 עבור המזהה הבא.
- חברו את שלוש המחרוזות ההקסדצימליות, בסדר זה, למחרוזת אחת בת 24 תווים.
דוגמה פתורה
נניח שתוכנית מתחילה לפעול בזמן Unix של 1,700,000,000 שניות, שהוא 14 בנובמבר 2023, בשעה 22:13:20 לפי UTC. היא בוחרת בערך האקראי 3f2a91c8d4 ומתחילה את המונה ב-12,345.
- חותמת הזמן בהקסדצימלי:
6553f100 - הערך האקראי בהקסדצימלי:
3f2a91c8d4 - המונה בהקסדצימלי:
003039
חיבורם יוצר את ה-ObjectID הראשון:
6553f1003f2a91c8d4003039
אם התוכנית יוצרת ObjectID שני באותה שנייה, חותמת הזמן והערך האקראי נשארים זהים, אך המונה עולה ל-12,346 (00303a):
6553f1003f2a91c8d400303a
גם קריאת ObjectID פועלת בכיוון ההפוך. בהינתן 507f1f77bcf86cd799439011, שמונת התווים הראשונים שלו, 8, 507f1f77, מפוענחים ל-1,350,508,407 שניות מאז תחילת עידן Unix, כלומר 17 באוקטובר 2012, בשעה 21:13:27 לפי UTC.
שימושים נפוצים ב-ObjectID של MongoDB
- מפתחות ראשיים. MongoDB מכניס ObjectID לשדה
_idשל מסמך באופן אוטומטי, אלא אם סופק ערך אחר. - איתור לפי זמן היצירה. מכיוון שחותמת הזמן משולבת במזהה, תוכנית יכולה לקרוא את זמן היצירה המשוער של מסמך ללא שדה תאריך נפרד.
- מיון לפי סדר ההוספה. מיון מסמכים לפי
_idממיין אותם בקירוב לפי זמן היצירה, מכיוון שחותמת הזמן מופיעה ראשונה בערך. - נתוני בדיקה ונתוני דמה. מפתחים משתמשים ב-ObjectID שנוצרו כדי לבנות מסמכים לדוגמה או בדיקות אוטומטיות בלי להפעיל מסד נתונים.
ObjectID של MongoDB לעומת UUID
UUID (מזהה ייחודי אוניברסלי) הוא ערך בגודל 16 בתים, גדול בארבעה בתים מ-ObjectID. UUID תקני הוא בדרך כלל אקראי לכל אורכו, ולכן אינו חושף את זמן היצירה ואינו מסתדר לפי סדר היצירה. ObjectID קצר יותר וממויין בקירוב לפי סדר היצירה, וזו אחת הסיבות לכך ש-MongoDB משתמש בו כברירת מחדל, אף שאין לו אותה ערובה רשמית לייחודיות שיש ל-UUID שנוצר כהלכה.
שאלות נפוצות
למה משמש ObjectID של MongoDB?
זהו הערך ש-MongoDB מכניס כברירת מחדל לשדה _id של מסמך, כך שכל מסמך מקבל מפתח ייחודי ללא הגדרה נוספת.
האם מובטח ש-ObjectID של MongoDB יהיו ייחודיים? לא במובן מתמטי רשמי, אך הסבירות להתנגשויות נמוכה ביותר. שני ObjectID צריכים לכלול את אותו ערך אקראי ואת אותה נקודת מונה באותה שנייה, דבר שקורה בדרך כלל רק בתוך תהליך יחיד.
האם אפשר לקרוא את תאריך היצירה מתוך ObjectID? כן. 8 התווים ההקסדצימליים הראשונים, כלומר 4 בתים, מכילים את מספר השניות מאז תחילת עידן Unix. המרת המספר הזה לתאריך נותנת את זמן היצירה המשוער.
כמה ObjectID מחוללים זה יכול ליצור בבת אחת? בין 1 ל-100 בכל אצווה. כל המזהים באצווה משתמשים באותו ערך אקראי לכל התהליך, ולכל אחד מהם מונה הגדול באחד מזה שלפניו.
האם אפשר להשתמש ב-ObjectID של MongoDB מחוץ ל-MongoDB? כן. מכיוון שהם רק ערכים בגודל 12 בתים המקודדים כטקסט הקסדצימלי, הם פועלים גם כמזהים ייחודיים במערכות אחרות, אף שסכמת המזהים של מסד נתונים מסוים עשויה להתאים טוב יותר לצרכיו.
האם המחולל הזה מחובר למסד נתונים אמיתי של MongoDB? לא. הוא פועל כולו בדפדפן ואינו קורא ממסד נתונים כלשהו ואינו כותב אליו.
הפניות
- "ObjectId." המדריך של MongoDB, https://www.mongodb.com/docs/manual/reference/method/ObjectId/.
- "ObjectId Specification." מפרטי BSON של MongoDB, https://github.com/mongodb/specifications/blob/master/source/bson-objectid/objectid.md.
- "BSON Types." מפרט BSON, https://bsonspec.org/spec.html.