MongoDB sorgusu Node.js sürücü biçiminden Mongoose biçimine nasıl uyarlanır

Aug 17 2020

Mongoose kullanan bir sorgu için söz dizimi konusunda biraz yardım almaktan memnun olurum.

İç içe geçmiş Nesne Kimliği dizisinden bir ObjectId kaldırmak için MongoDB Node.js sürücüsünü kullanarak iyi çalışan bu sorgum var:

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

Sorguyu Mongoose Şeması kullanarak çalıştırmayı denediğimde, sorgu ObjectId'i diziden kaldırmıyor, ancak herhangi bir hata atmıyor:

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 şeması, şu şekilde tanımlanan bu alanlar için şemaya sahiptir:

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

Yanıtlar

1 turivishal Aug 17 2020 at 16:19

Dize kimliğini kullanarak nesne kimliğine dönüştürebilirsiniz 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); } }
);