วิธีปรับการสืบค้น MongoDB จากรูปแบบไดรเวอร์ Node.js เป็นรูปแบบ Mongoose

Aug 17 2020

ฉันขอขอบคุณสำหรับความช่วยเหลือเกี่ยวกับไวยากรณ์สำหรับการสืบค้นโดยใช้ Mongoose

ฉันมีแบบสอบถามนี้ซึ่งทำงานได้ดีโดยใช้ไดรเวอร์ MongoDB Node.js เพื่อลบ ObjectId ออกจากอาร์เรย์ของ Object ID ที่ซ้อนกัน:

    let filter = { _id : new ObjectId('5f30b40839aab119f4b3e21d'), 'groups._id': new ObjectId('5f3a23ec3680923d04ff970c') };
    let update = { $pull: { "groups.$.students": new ObjectId('5f1a57a9d433f86ec0750c2c') }};

          client.db('database').collection('collection').findOneAndUpdate(filter, update, function(err, res) {
              if (err) console.log(err);
              console.log(JSON.stringify(res, null, 2));
              client.close();
          }); 

เมื่อฉันพยายามเรียกใช้แบบสอบถามโดยใช้ Mongoose Schema แบบสอบถามไม่ได้ลบ ObjectId ออกจากอาร์เรย์ แต่ไม่ได้ทำให้เกิดข้อผิดพลาดใด ๆ :

let groupFilter = { _id: existingClassroom._id, 'groups._id': groupId };
let groupUpdate = { $pull: { "groups.$.students": existingUser._id } };
await Classroom.findOneAndUpdate(groupFilter, groupUpdate, {new: true}, async (err, doc) => {
 if(err){
  console.log(err);
 }
});

Mongoose schema มีสคีมาสำหรับฟิลด์เหล่านี้ที่กำหนดไว้เช่นนี้:

  groups:[
    {
      students:[
        mongoose.Schema.Types.ObjectId
      ],
      dateCreated: {
          type: Date,
          default: Date.now
      }
    }
  ]

คำตอบ

1 turivishal Aug 17 2020 at 16:19

คุณสามารถแปลงสตริง ID ไปยังวัตถุ ID ใช้mongoose.Types.ObjectId,

let groupFilter = { 
  _id: mongoose.Types.ObjectId(existingClassroom._id), 
  'groups._id': mongoose.Types.ObjectId(groupId) 
};
let groupUpdate = { 
  $pull: { "groups.$.students": mongoose.Types.ObjectId(existingUser._id) 
  } 
};
await Classroom.findOneAndUpdate(groupFilter, groupUpdate, { new: true }, 
  async (err, doc) => { if (err) { console.log(err); } }
);