Come adattare la query MongoDB dal formato del driver Node.js al formato Mongoose

Aug 17 2020

Apprezzerei un po 'di aiuto con la sintassi per una query che utilizza Mongoose.

Ho questa query che funziona bene utilizzando il driver MongoDB Node.js per rimuovere un ObjectId da un array nidificato di ID oggetto:

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

Quando provo a eseguire la query utilizzando Mongoose Schema, la query non rimuove ObjectId dall'array, ma non genera errori:

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

Lo schema Mongoose ha lo schema per questi campi definito in questo modo:

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

Risposte

1 turivishal Aug 17 2020 at 16:19

Puoi convertire l'ID stringa in ID oggetto usando 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); } }
);