سؤال

أنا أعمل مع Node.js لإنشاء خادم مقبس ويب يستخدم MongoDB.

أنا أستخدم Node-Mongodb Native كمكتبة للوصول إلى Mongo DB.

عندما أتصل console.log (sys.inspect (العنصر)) على كائن من DB ، أحصل على شيء يشبه هذا:

{ _id: { id: 'L?#&\u008e\u00ad\u000e\u008f\u0014\u0005\u0000\u0000' }
, y: 3
, favorite_color: 'orange'
, x: 14766
}

لذلك أعتقد أن المعرف هو معرف كائن BSON الذي يستخدمه Mongo.

أحتاج إلى إرسال هذا الكائن إلى متصفح ويب العميل باستخدام JSON ، وجعلهم يقومون ببعض الأشياء إليه ، ثم إرساله إلى الخادم.

عندما أقوم بـ json.stringify (عنصر) ، أحصل على شيء يشبه هذا:

{"_id":"4c3f23268ead0e8f14050000","y":3,"favorite_color":"orange","x":14766}

لذلك تم تحويل المعرف إلى بعض السلسلة المشفرة. إذا أرسلتها إلى العميل ، وأرسلها العميل مرة أخرى ، فأنا الآن بحاجة إلى تحديثه في DB. أقوم بتشغيل json.parse (العنصر) لأجعله كائنًا عاديًا ، لكنه لا يزال يبدو:

{ _id: '4c3f23268ead0e8f14050000'
, y: 3
, favorite_color: 'orange'
, x: 14766
}

ولا يمكن استخدام _id للبحث في MongoDB.

كيف يمكنني تحويله إلى تنسيق يمكن استخدامه للبحث عن مونغو؟

--تحديث--

ومن المثير للاهتمام أنه يمكنني استخدام findOne({_id:item._id}, collection) للحصول على المستند ، ولكن إذا قمت بذلك:

findOne({_id:{id : item._id.id}}, collection)

أنا لا أتلقى نتيجة. أعتقد أن هناك شيئًا مميزًا حول كائن Mongo _id.

كلاهما {_id:item._id} و {_id:{id : item._id.id}}عندما يتم التخلص من ذلك ، تبدو هكذا:

{ _id: { id: 'L?#&\u008e\u00ad\u000e\u008f\u0014\u0005\u0000\u0000' } }

-تم حل تحديث آخر ---

كان هناك بعض معالجة معرف الكائن في ملف اختبار التكامل.

ObjectId = new mongo.objectid.createfromHexString ('47CC67093475061E3D95369D') ؛ سأعطي _id التي أبحث عنها.

ObjectId.ToHexString () سيعيد سلسلة السداسي التي تشبه "47CC67093475061E3D95369D"

هل كانت مفيدة؟

المحلول

أظن أن هذا sys.inspect يفسر معرف الكائن ككائن يحتوي على id منشأه. هذا ما تراه في التفريغ.

يعامل MongoDB ObjectID كقيمة ثنائية 12 بايت ، وليس ككائن. لذلك Mongodb لا يعرف أي شيء id منشأه. لهذا السبب لا ينتج عن الاستعلام التالي نتيجة:

findOne({_id: {id: item._id.id}}, collection)

ما يلي يعمل ، لأنه يعامل فقط كلتا القيم كقيم ثنائية:

findOne({_id: item._id}, collection)
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top