Home > Enterprise >  Update document in MongoDB via NodeJS
Update document in MongoDB via NodeJS

Time:03-19

So my knowledge of NodeJS and MongoDD are non-existent (just need to do a small code update for a friend) and I'm stuck.

Need to update a single document inside a collection via a unique id but can't seem to do it.

Here's the Model (I've trimmed it down and cut out all unnecessary data). I'm trying to update the field notes inside a transaction.

In short each entry in the given (an Agent) table will have a collection of multiple Transactions & Documents. I need to update a specific Transaction with the unique _id that is auto generated.

import { Schema, model } from 'mongoose';

interface Transaction {
  first_name: string;
  last_name: string;
  type: string;
  notes: string;
}

interface Agent {
  org_id: number;
  transactions: Array<Transaction>;
  documents: Array<string>;
}

const transactionSchema = new Schema<Transaction>({
  first_name: { type: String },
  last_name: { type: String },
  type: { type: String },
  notes: String,
});

const transactionsSchema = new Schema<Agent>({
  org_id: { type: Number },
  transactions: [transactionSchema],
  documents: [documentTypesSchema],
});

const AgentTransaction = model<Agent>(
  'agent_transaction_table',
  transactionsSchema
);

export default AgentTransaction;

Here's what I tried but didn't work (obviously), again I've trimmed out all unnecessary data. Just to clarify, the endpoint itself works, but the DB update does not.

import AgentTransaction from '../models/transaction'; // the above model
transaction.put('/notes', async (req, res) => {
  const { org_id, transaction_id, notes } = req.body;

  try {
    const notesResult = await AgentTransaction.updateOne({
      'transactions._id': transaction_id,
    }, {
      $set: {
        'notes': notes
      },
    });
 
    res
      .status(200)
      .json({ message: 'Updated', success: true, notesResult });
  } catch (error) {
    res.status(400).send(error);
  }
});

CodePudding user response:

So I figured it out. Maybe it'll help someone else as well.

const notesResult = await AgentTransaction.updateOne({
  'transactions._id': { $in: [trunc2] },
}, {
  $set: {
    'transactions.$.notes': notes
  },
});

The main issue was that the payload object needed to target the collection folder the wildcard the field, not just only the field.

  • Related