همه چیز در مورد ساختار ObjectId در MongoDB

همه چیز در مورد ساختار ObjectId در MongoDBدر این مقاله میخوام اطلاعات کاملی در مورد ساختار ObjectId در MongoDB رو در اختیارتون قرار بدم تا بدونین که MongoDB چطور و چگونه از از این ویژگی استفاده میکنه.

کلاس ObjectId کلید اصلی پیش‌فرض برای document‌های MongoDB هست و معمولا در ویژگی [tag]_id[/tag] اسناد یا document هایی که اضافه میشن، قرار داده میشه. مثال زیر رو ببینید:

{
    "_id": ObjectId("54759eb3c090d83494e2d804")
}

ساختار ObjectId

یک Object در MongoDB یک BSON Type با اندازه 12 بایت هست. این ObjectId‌ها با یک الگوریتم پیش فرض توسط MongoDB ساخته میشن که در ادامه در مورد اون توضیح میدم. یک ObjectId با اندازه 12 بایت شامل موارد زیر هست:

  • 4 بایت اول تعداد ثانیه‌های گذشته از Unix epoch یا 1 ژانویه 1970 میلادی رو نشون میده.
  • 3 بایت بعد مشخص کننده شناسه دستگاه یا machine identifier می‌باشد.
  • 2 بایت بعد مشخص کننده process id سیستم هست
  • 3 بایت نهایی از یک عدد تصادفی شروع میشه و زیاد میشه.

این 12 بایت در کنار یکدیگر یک مقدار یکتا رو به وجود میارن که MongoDB از اون برای [tag]_id[/tag] هر document استفاده میشه. برای تست کردن این مورد در ابتدا بسته mongodb رو نصب میکنیم. برای اینکار بصورت زیر عمل میکنیم:

npm install mongodb --save

حالا در command line یا محیط nodejs کدهای زیر رو اجرا میکنم:

var ObjectId = require('mongodb').ObjectID;
var id = new ObjectId();
console.log(id);

با اینکار 12 بایت مورد نظر ساخته میشه و به شما کد هگزادسیمال اون نشون داده میشه. کدی که به من نشون داده میشه، [tag]5c24ebb6cfdabe1fa85ffaba[/tag] هست که اگر شما این کار رو انجام بدین، کد متفاوتی رو خواهید دید. شما همچنین میتونین 12 بایت مورد نظرتون رو به کلاس ObjectId پاس بدین، تا با کلید مورد نظرتون ساخته بشه. برای اینکار بصورت زیر عمل میکنیم:

var ObjectId = require('mongodb').ObjectID;
var id = new ObjectId("aaaaaaaaaaaa");
console.log(id);

با اینکار مقدار 616161616161616161616161 که هگزادسیمال مربوط به aaaaaaaaaaaa هست به شما نمایش داده میشه.

چگونه در MongoDB برای document‌ها ObjectId تولید کنیم؟

جواب این سوال خیلی ساده هست. زمانی که شما در MongoDB یک یا چند document جدید رو به وجود میارید، خود MongoDB بصورت پیش‌فرض برای ویژگی [tag]_id[/tag] اونا یک ObjectId رو قرار میده که همه اونا Unique و یکتا هستند. مثلا یک document بصورت زیر قرار میدیم:

همونطور که میبینید insertedId که مربوط به document قرار داده شده هست، نمایش داده میشه.

حالا با استفاده از find میتونین همه document هایی که درون users هستند رو ببینید. بصورت زیر:

میبینید که ObjectId مورد نظر در ویژگی [tag]_id[/tag] قرار داده شده است. زمانی که با استفاده از دستور insert یا save مواردی رو در MongoDB قرار میدین، اگر ویژگی [tag]_id[/tag] رو مشخص نکنید، خود MongoDB بصورت اتوماتیک یک ObjectId یکتا رو تولید میکنه و برای هر ویژگی [tag]_id[/tag] مربوط به هر document قرار میده.

بدست آوردن timestamp مربوط به ObjectId

همونطور که در بالا هم گفته شد، 4 بایت ابتدایی مربوط به ObjectId، زمان بعد از Unix time رو نشون میده. با استفاده از متد getTimestamp میتونین این 4 بایت رو خروجی بگیرید و زمان رو ببینید. برای اینکار بصورت زیر عمل میکنیم:

> ObjectId("58ce9d76c65f10f0e30f5510").getTimestamp()
ISODate("2017-03-19T15:02:14Z")

همونطور که میبینید تاریخ با فرمت ISO نمایش داده میشه.

تبدیل کردن ObjectId به رشته

برای اینکه بتونین ObjectId رو به رشته تبدیل کنید و از اون در جاهایی که نیاز دارید استفاده کنید، میتونین از ویژگی str استفاده کنید. برای اینکار بصورت زیر عمل میکنیم:

> getNewObjectId.str
58ce9d76c65f10f0e30f5510

همونطور که مشاهده کردید با این روش به رشته مورد نظر دسترسی پیدا کردیم و میتونیم از اون استفاده کنیم.

 
ارسال دیدگاه
ما همه سوالات و دیدگاه ها رو می خونیم و پاسخ میدیم
۲ دیدگاه
MAHSA LAHZEEE ۰۹ دی ۱۳۹۷، ۱۵:۴۹
یعنی این جاوا اسکریپت همه فن حریفه :|
محمد اسفندیاری ۰۹ دی ۱۳۹۷، ۱۸:۰۱
بله همینطوره در همه زمینه‌ها میتونین از Javascript استفاده کنید