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

السؤال

نشر

لدي مجموعة من المستندات تحوي حقل معرّف ObjectID بنمط سلسلة نصيّة بدلاً من النمط Object ID المستخدم في mongodb.

{
	....
	newID: "f9e1fa551137c2c572808a5f"
}

هل يوجد طريقة معيّنة استطيع من خلالها أثناء عملية المقارنة التأكد من أن هذه السلسلة النصية (أي الحقل newID) هي ID صالح في mongoDB وبالتالي تحويله إلى ObjectID ؟

Recommended Posts

  • 1
نشر

تستطيع إستخدام مكتبة mongoose أو mongodb نفسها للتحقق من أن المعرف id صالح.

استيراد ObjectId من حزم mongodb أو mongoose:

  • باستخدام Mongodb:
const ObjectId = require('mongodb').ObjectId;
// or
const mongodb, {ObjectId} = require('mongodb');
  • باستخدام Mongoose:
const ObjectId = require('mongoose').Types.ObjectId;

ومع ذلك ، يقوم (id)ObjectId.isValid بإرجاع true حتى بالنسبة للسلاسل غير الصالحة ذات الطول 12.

لمنع مثل هذه الحالات ، يمكن إضافة فحص آخر بعد التحقق الافتراضي الذي سيعيد صواب أو خطأ بناءً على الشرط:

(String)(new ObjectId(id)) === id

إنشاء دالة بهذا الشرط:

const mongoose = require('mongoose'),
    ObjectId = mongoose.Types.ObjectId;
  
// Validator function
function isValidId(id){
      
    if(ObjectId.isValid(id)){
        if((String)(new ObjectId(id)) === id)
            return true;        
        return false;
    }
    return false;
}

console.log(ObjectId.isValid("barbarbarbar")) // true
console.log(isValidId("barbarbarbar")) // false
console.log(isValidId("594ced02ed345b2b049222c5")) // true

أيضاً إبتداءً من Mongoose > 5.7.12 تم إضافة دالة تقوم بعمل نفس الشيء: isValidObjectId:

mongoose.isValidObjectId(string); /* true or false */
  • 1
نشر

يمكنك استخدام  نمط RegEx للتحقق من صحة ال id كما يلي:

if (id.match(/^[0-9a-fA-F]{24}$/)) {
       
   // ObjectID تُمثل  
} else {
    // ObjectID ليست     
}

و يمكنك استخدام هذه الدالة أيضًا و التي يمكن أن تمرر لها سلسلة نصية أو int أو objectId و ستقوم بإرجاع objectId إذا كان ال id المرر لها صالح أو null إذا لم يكن صالحًا:

var ObjectId= require('mongoose').Types.ObjectId;

function toObjectId(id) {

    var stringId = id.toString().toLowerCase();

    if (!ObjectId.isValid(stringId)) {
        return null;
    }

    var result = new ObjectId(stringId);
    if (result.toString() != stringId) {
        return null;
    }

    return result;
}

 

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

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

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

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   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.

  • إعلانات

  • تابعنا على



×
×
  • أضف...