No puedo actualizar una matriz dentro de un documento en MongoDB (Mongoose). Aquí está mi definición para un modelo de stock.
const ticker = new mongoose.Schema({ ticker: String, Price: Number, Amount: Number, PastPrices: [Number] }); export const stock = mongoose.model("Stocks", ticker);Aquí hay un documento en MongoDB
{ "_id": { "$oid": "61e5d0e1dfda4d7c85dc8fe2" }, "PastPrices": [ 2 ], "ticker": "TSLA", "Price": 2, "Amount": 0, "__v": 0 }Estoy ejecutando esto en mongoose y PastPrices no se actualiza. Quiero poder ingresar cada pocos segundos en esta matriz y luego representarla en un gráfico
stock.updateOne({ticker: "TSLA"}, { $push: { PastPrices:1}} );No recibo ningún error, pero simplemente no se actualiza.
updateOne devuelve una consulta , que no ejecuta su actualización de inmediato. De la guía Mongoose para Consultas dice:
Una consulta de mangosta se puede ejecutar de dos maneras. Primero, si pasa una función de devolución de llamada, Mongoose ejecutará la consulta de forma asíncrona y pasará los resultados a la devolución de llamada.
Una consulta también tiene una función .then() y, por lo tanto, se puede usar como una promesa.
Lo que significa que puede pasar una función de devolución de llamada como en la documentación para ejecutar Consultas :
const Person = mongoose.model('Person', yourSchema); // find each person with a last name matching 'Ghost', selecting the `name` and > `occupation` fields Person.findOne({ 'name.last': 'Ghost' }, 'name occupation', function (err, person) { if (err) return handleError(err); // Prints "Space Ghost is a talk show host". console.log('%s %s is a %s.', person.name.first, person.name.last, person.occupation); });
También puede usar then o exec si desea usar Promesas. De la documentación de Mongoose para promesas :
const query = Band.findOne({name: "Guns N' Roses"}); assert.ok(!(query instanceof Promise)); // A query is not a fully-fledged promise, but it does have a `.then()`. query.then(function(doc) { // use doc }); // `.exec()` gives you a fully-fledged promise const promise = Band.findOne({name: "Guns N' Roses"}).exec(); assert.ok(promise instanceof Promise); promise.then(function (doc) { // use doc });
Si está en un método asíncrono, también puede await la consulta:
await stock.updateOne({ticker: "TSLA"}, { $push: { PastPrices:1}} );Su consulta es correcta, pero para que la consulta devuelva datos actualizados, debe pasar la configuración adicional { new: true } . Si no lo pasa, la consulta actualizará los datos, pero devolverá datos antiguos.
stock.updateOne( { ticker: "TSLA" }, { $push: { PastPrices:1 } }, { new: true } );