typescript - findOneAndUpdate uppdaterar inte
Jag försöker uppdatera ett av mina dokument som är lagrat på mongoose-servern genom att använda findOneAndUpdate. Jag ställde in det som en PUT-förfrågan och så här definierade jag det.
public updateConfigWithType(req: Request, res: Response) {
configs.findOneAndUpdate({'companyInfo.uniquecompanyid': req.params.id}, { $set: { companyName: "ITSWORKING" }} ,(err,doc) => {
if (err) {
res.send(err);
}else {
res.json({
message: 'Succesfully updated this item'
});
}
})
}
Min PUT-förfrågnings-URL är uppsatt så här: http://localhost:3000/parserConfig/123123wfdwedfwfwefwef
Detta är en liten del av JSON-data som finns i mina dokument på min Mongoose-server:
{
"_id": {
"$oid": "5bbf27ad4cf8a6be65ea6257"
},
"companyInfo": {
"companyName": "example",
"hashKey": "sdfsdf",
"hashFunction": "sdfsdf",
"uniquecompanyid": "123123wfdwedfwfwefwef"
},
"version": "1",
"__v": 0,
"parserConfig": {
"id": {
"fieldName": "key",
"path": "key"
},
Så, jag vill kunna hitta rätt dokument med det unika företags-ID:t som finns i URL:en och jag vill specifikt UPPDATERA fältet parserConfig med det som finns i req.body. Jag har hårdkodat allt för tillfället för teständamål.. Att skicka en PUT-förfrågan ger mig för närvarande detta svar i Postman:
{"message":"Succesfully updated this item"}
Men inget har uppdaterats. Vad missar jag?
Uppdatering
Jag ändrade koden för teständamål... Det här är vad jag försökte:
public updateConfigWithType(req: Request, res: Response) {
var query = {'companyInfo.uniquecompanyid':req.params.id};
configs.findOneAndUpdate(query, {$set:{'companyInfo.uniquecompanyid':"heheheheh"}}, {new:true}, function(err, doc){
if (err) {
return res.send(err);
}
return res.send(doc);
});
}
Svaret i Postman är det GAMLA dokumentet. Inget har ändrats
UPPDATERING efter Spyros begäran
10:26:34 PM web.1 | Mongoose: configs.findOne({ 'companyInfo.uniquecompanyid': '123123wfdwedfwfwefwef' }, { new: true, projection: {} })
10:26:34 PM web.1 | PUT /parserConfig/123123wfdwedfwfwefwef 200 158.118 ms - 2089
UPPDATERING ny informationsmeddelande
Jag stötte på detta: https://github.com/Automattic/mongoose/issues/7011
där det står:
Jag märkte att när man anropar findOneAndUpdate med en uppdateringsdokumentegenskap som inte finns i schemat, visar debug-utdata den (felaktiga)? samlingsmetoden.
Varför skulle det fungera att uppdatera samma egenskap genom Studio 3T men inte genom min kod?
Svar #1
Aktivera debug-loggning: mongoose.set('debug', true);. Detta kommer att visa dig de frågor som körs. Jag tror att felet kan vara relaterat till någon felskrivning av någon attribut eller ett annat objekt-id. Om det inte hjälper, uppdatera din fråga med information om debug-resultatet så kan jag uppdatera mitt svar.
Svar #2
Från och med Mongoose v7.6.2 anger dokumentationen att:
Det strikta alternativet (aktiverat som standard) säkerställer att värden som skickas till vår modellkonstruktör och som inte specificerats i vårt schema inte sparas till databasen.
Samma som du, jag kan inte definiera ett schema för samlingen eftersom mina dokument varierar mycket. Det som fungerade för mig var att lägga till strict: false i schemat för samlingen.
import { Schema } from 'mongoose';
const DynamicDocumentSchema = new Schema(
{ bar: String },
{ strict: false }
);
EFTERSKRIFT
Om någon undrar kan du också lägga till strict: false i uppdateringsfrågan precis som nedan. Detta åsidosätter vilket värde strict har i schemat.
await DynamicDocumentModel.findByIdAndUpdate(
docId,
{
$set: <whatever_update>
},
{ strict: false }
);
