اذهب إلى المحتوى

السؤال

نشر

استخدم mongoose في node.js، وضمن هيكلية البيانات نسيت تعريف الحقول timestamps، ولكن حسب التوثيق الرسمي وجدت أن الحقل المعرّف الفريد لكل مستند id يحوي بداخله قيمة الوقت والتاريخ لإنشاء كل مستند. ولكن كيف يمكنني استخراج هذه القيم من ObjectID في mogoose. وإجراء استعلام عليها بشكل مشابه للتالي:

collection.find({date: {$gt: new Date(2021,1,1)}});

 

Recommended Posts

  • 0
نشر

يمكنك استخدام التابع getTimestamp مباشرةً على قيمة الحقل _id وبالتالي سيتم استعادة قيمة التاريخ والوقت حسب timestamp الموجود ضمن هذه القيمة:

ObjectId.prototype.getTimestamp = function() {
    return new Date(parseInt(this.toString().slice(0,8), 16)*1000);
}

وضمن mongo shell يمكنك تنفيذ الكود التالي:

var time = document._id.getTimestamp();

وستظهر لك قيمة الوقت بالشكل التالي في حال قمت بطباعتها:

Wed Sep 07 2021 18:37:37 GMT+1000 (AUS Eastern Standard Time) // أو حسب الوقت الموجود

أما للمقارنة مع وقت محدد من خلال mongoose في الكود لديك، يمكنك وضع الشرط التالي:

document._id.getTimestamp() > new Date("2020-12-12")

بحيث يتم استخدام الغرض Date الموجود في الجافاسكريبت. مع إمكانية التحكّم بصيغة الوقت حسب المطلوب.

 

  • 0
نشر

التاريخ أو timestamp يكون محفوظ في الأربعة بايت الأولى من id_ الخاص ب mongodb ويمكنك الحصول عليه كالآتي

/* هذه الدالة تُرجع 
 * ObjectId
 * مُضمن مع التاريخ
*/
// الدالة تقبل كائن التاريخ أو مُدخل سلسلة نصية

function objectIdWithTimestamp(timestamp) {
  	// تحويل التاريخ النصي الى كائن تاريخ والا سيكون كائن تاريخ على أية حال
    if (typeof(timestamp) == 'string') {
        timestamp = new Date(timestamp);
    }

  	// تحويل الكائن التاريخ الى ثواني سداسية عشر Hexadecimal
    var hexSeconds = Math.floor(timestamp/1000).toString(16);

  	/* إنشاء 
  	 * ObjectId
     * مع التاريخ السداسي عشر
     */
    var constructedObjectId = ObjectId(hexSeconds + "0000000000000000");

    return constructedObjectId
}


// مثال
// ابحث عن كل المستندات التي تم إنشائها بعد هذا التاريخ
db.mycollection.find({ _id: { $gt: objectIdWithTimestamp('1980/05/25') } });

كما يمكنك استخراج التاريخ من أي ObjectId عبر هذا الموقع

  • 0
نشر

يمكنك استخراج ال timestamp من ال id عن طريق ObjectId ملحوقة ب getTimestamp 

ObjectId("507c7f79bcf86cd7994f6c0e").getTimestamp()

وستحصل على 

ISODate("2012-10-15T21:26:17Z")

لكن اذا أردت الفلترة باستخدام وقت معين فستحتاج لألية تحويل 

//وظيفة تأخذ وقت معين وتحول الى معرف
const objectIdFromDate = function (date) {
	return Math.floor(date.getTime() / 1000).toString(16) + "0000000000000000";
};

// وظيفة تأخذ معرف وتحول الى وقت
const dateFromObjectId = function (objectId) {
	return new Date(parseInt(objectId.substring(0, 8), 16) * 1000);
};

بافتراض انك تريد الان ان تحصل المستندات المنشئة بعد 10/23/2015

const dateString = "10/23/2015"; 

const dateObject = new Date(dateString);

const id = objectIdFromDate(dateObject)

db.comments.find({_id: {$gt: ObjectId(id)}})

 

انضم إلى النقاش

يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.

زائر
أجب على هذا السؤال...

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   جرى استعادة المحتوى السابق..   امسح المحرر

×   You cannot paste images directly. Upload or insert images from URL.

  • إعلانات

  • تابعنا على



×
×
  • أضف...