Bagaimana mengadaptasi query MongoDB dari format driver Node.js ke format Mongoose

Aug 17 2020

Saya sangat menghargai bantuan dengan sintaks untuk kueri menggunakan Mongoose.

Saya memiliki kueri ini yang berjalan dengan baik menggunakan driver MongoDB Node.js untuk menghapus ObjectId dari array ID Objek bersarang:

    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();
          }); 

Ketika saya mencoba menjalankan kueri menggunakan Skema Mongoose, kueri tidak menghapus ObjectId dari larik, tetapi tidak memunculkan kesalahan apa pun:

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);
 }
});

Skema Mongoose memiliki skema untuk bidang-bidang ini yang ditentukan seperti ini:

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

Jawaban

1 turivishal Aug 17 2020 at 16:19

Anda dapat mengonversi id string menjadi id objek menggunakan 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); } }
);