Estoy tratando de pasar datos nuevos a un objeto sin reemplazar los datos antiguos usando nodejs. La estructura de mi base de datos Mongodb (antes de agregar nuevos datos) está debajo
{ "_id" : ObjectId("58fd05f7fb69f42d54fccd12"), "Transaction" : { "QRIDNumber6666" : { "retailer" : "watson", "discount" : "10%", "tax" : "5%", "Transaction Detail" : [ { "quantity" : "1", "pname" : "coca", "price" : "3" }, { "quantity" : "3", "pname" : "pepsi", "price" : "5" } ] } } }Lo que quiero lograr es agregar otro QRIDNumber en Transaction, Ej: QRIDNumber 7777, que tiene valores diferentes pero la misma estructura en comparación con QRIDNumber6666
Mi intento actual es usar el siguiente código en nodejs
app.put('/contactlist/', function (req, res) { var id = "58fd05f7fb69f42d54fccd12"; db.CollectionName.findAndModify({ query: {_id: mongojs.ObjectId(id)}, update: {$set: {Transaction: req.body}}, new: true}); });Nota: req.body son los detalles y valores de QRIDNumber7777 que se enviarán desde mi controlador.
El resultado final de mi código fue que simplemente reemplazó todo el contenido anterior en "Transacción" (QRIDNúmero6666) y lo reemplazó solo con contenido nuevo (QRIDNúmero7777).
Deseo que ambos datos permanezcan. Agregar nuevos contenidos en "Transacción" sin eliminar los antiguos
Bien, asumiendo que siempre tendrás un objeto con 1 clave en req.body . Me gusta:
req.body = {"QRIDNumber7777": {...}}
Primero, necesitas saber el nombre de la clave:
const insertedTransactionName = Object.keys(req.body)[0]; // QRIDNumber7777Ahora puede actualizar su documento sin sobrescribir otros campos.
app.put('/contactlist/', function(req, res) { var id = "58fd05f7fb69f42d54fccd12"; db.CollectionName.findAndModify({ query: { _id: mongojs.ObjectId(id) }, update: { $set: { [`Transaction.${insertedTransactionName}`]: req.body[insertedTransactionName] } }, new: true }); });Tenga en cuenta esta línea:
$set: { [`Transaction.${insertedTransactionName}`]: req.body[insertedTransactionName] } En lugar de sobrescribir todo el documento Transaction , actualiza solo una propiedad anidada. Por lo tanto, aún quedan datos QRIDNumber6666 .
Debe actualizar su estructura a la matriz Transaction en lugar de crear claves dinámicas.
Esto lo ayudará más adelante cuando desee actualizar los campos individuales haciendo referencia al operador posicional.
Así que deberías cambiar tu estructura a
{ "_id" : ObjectId("58fd05f7fb69f42d54fccd12"), "Transaction" : [{ "QRIDNumber": 6666, "retailer" : "watson", "discount" : "10%", "tax" : "5%", "Transaction Detail" : [ { "quantity" : "1", "pname" : "coca", "price" : "3" }, { "quantity" : "3", "pname" : "pepsi", "price" : "5" } ] }] } Use $push para agregar la nueva entrada 7777 a la matriz Transaction .
app.put('/contactlist/', function (req, res) { var id = "58fd05f7fb69f42d54fccd12"; db.CollectionName.findAndModify({ query: {_id: mongojs.ObjectId(id)}, update: {$push: {Transaction: req.body}}, new: true}); });