Node.js สตริง Mongoose.js ไปยังฟังก์ชัน ObjectId


174

มีฟังก์ชั่นในการเปลี่ยนสตริงเป็น objectId ในโหนดโดยใช้พังพอนหรือไม่? สคีมาระบุว่าบางสิ่งบางอย่างเป็น ObjectId แต่เมื่อมันถูกบันทึกจากสตริง mongo บอกฉันว่ามันยังคงเป็นเพียงแค่สตริง _id objectId("blah")ของวัตถุเช่นจะแสดงเป็น

คำตอบ:


419

คุณสามารถทำได้เช่น:

var mongoose = require('mongoose');
var id = mongoose.Types.ObjectId('4edd40c86762e0fb12000003');

ใช่มันค่อนข้างสะอาดกว่าในกรณีนี้ อาจจะต้องใช้ mongo.BSONPure ถ้าทำ fromTime ()
talentedmrjones

3
สิ่งนี้ทำให้เกิดข้อผิดพลาดหรือไม่หากเป็นสตริงที่ไม่ถูกต้อง กำลังมองหาวิธีที่ดีที่สุดในการตรวจสอบความถูกต้องของอินพุตใน REST API สำหรับฟิลด์ mongo id
Zambonilli

1
ไม่ตอบคำถามจริงๆเพราะใช้วิธีการนี้สตริงจะถูกแปลงและไม่เหมือนกับต้นฉบับ
ed209

mongoose.Types.ObjectId (id) แต่ id ของฉันไม่ได้กำหนดไว้แล้วมันจะส่งคืนอะไร ID หรือข้อผิดพลาดใหม่
Keval Bhatt

@KevinDente ฉันใช้ Nodejs กับ typescript ฉันได้ลองใช้วิธีแก้ปัญหาของคุณแล้ว แต่ยังได้รับสตริงและแบบสอบถามของฉันไม่ส่งคืนสิ่งที่ควรคืน ความคิดเกี่ยวกับวิธีการทำมันบน typescript?
SOufiane Fadil

9

คุณสามารถทำได้เช่นนี้:

var mongoose = require('mongoose');
var _id = mongoose.mongo.BSONPure.ObjectID.fromHexString("4eb6e7e7e9b7f4194e000001");

แก้ไข: มาตรฐานใหม่มี fromHexString มากกว่า fromString


1
ดีกว่ามาตรฐาน "ใหม่" ดูเหมือนว่าจะเป็น mongoose.mongo.BSONPure.ObjectID.createFromHexString () (ณ mongoose 3.9.7)
Evereq

1
สำหรับผู้ที่พยายามทำเช่นนี้นี่เป็นคำตอบที่ดีกว่าคำตอบที่เลือกเพราะจะไม่เปลี่ยน ID หากคุณใช้รหัส Mongo อยู่แล้ว
ed209

1
วิธีนี้ใช้ไม่ได้อีกต่อไปใช้คำตอบที่ยอมรับแทน
paper1111

BSONPure ไม่ได้เป็นส่วนหนึ่งของmongoose.mongoฉัน มีใครยืนยันได้บ้าง
Artur Tagisow

5

ตัดสินจากความคิดเห็นที่คุณกำลังมองหา:

mongoose.mongo.BSONPure.ObjectID.isValid

หรือ

mongoose.Types.ObjectId.isValid

5
var mongoose = require('mongoose');
var _id = mongoose.mongo.ObjectId("4eb6e7e7e9b7f4194e000001");

3
คุณสามารถแสดงความคิดเห็นเกี่ยวกับความแตกต่างระหว่างmongoose.Types.ObjectIdและmongoose.mongo.ObjectId? คุณสมบัติวัตถุของพังพอนนั้นแตกต่างกัน แต่อาจอ้างอิงถึงวิธีการเดียวกันภายใต้ โปรดแสดงความคิดเห็นเกี่ยวกับวิธีการอ้างอิง ณ วันที่VSTypes mongo
steampowered

5

ฉันไม่สามารถแก้ไขวิธีนี้ (เป็นที่ยอมรับว่าฉันค้นหาได้ไม่นาน)

mongoose.mongo.BSONPure.ObjectID.fromHexString

หากสคีมาของคุณคาดว่าคุณสมบัตินี้จะเป็นประเภท ObjectId การแปลงจะเป็นนัยอย่างน้อยก็น่าจะเป็นเช่นนี้ใน 4.7.8

คุณสามารถใช้บางสิ่งเช่นนี้ได้ แต่ให้ความยืดหยุ่นมากกว่าเดิม:

function toObjectId(ids) {

    if (ids.constructor === Array) {
        return ids.map(mongoose.Types.ObjectId);
    }

    return mongoose.Types.ObjectId(ids);
}

3

คุณสามารถใช้สิ่งนี้ได้เช่นกัน

const { ObjectId } = require('mongodb');
const _id = ObjectId("4eb6e7e7e9b7f4194e000001");

มันเป็นวิธีที่ง่ายที่สุดที่จะทำ


0

เพียงดูข้อมูลโค้ดด้านล่างหากคุณใช้ REST API ผ่านทาง express และ mongoose (ตัวอย่างสำหรับ ADD)

....
exports.AddSomething = (req,res,next) =>{
  const newSomething = new SomeEntity({
 _id:new mongoose.Types.ObjectId(), //its very own ID
  somethingName:req.body.somethingName,
  theForeignKey: mongoose.Types.ObjectId(req.body.theForeignKey)// if you want to pass an object ID
})
}
...

หวังว่ามันจะช่วย

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.