Thursday, 25 May 2017

How to update a nested field in mongodb with monk in node.js

I'm having a bit of a struggle with updating my mongodb database with new records. The database consists of fields of exercises that are arrays and when I do a PUT header I'd like to update the specific exercise with a new record, not override the whole field of specific exercise as I'd like to keep the history of progress. So far I can only GET the specific nested fields as seen in router.get('/:nickname/:info'), where we can specify the user and their name, age or gender. I can do the same with exercises field, but I keep failing at updating those. Here's the database:

[
  {
    "_id": "5927243d1028840e7b49a5f5",
    "nickname": "annwumy",
    "info": {
      "name": "Bert",
      "gender": "male",
      "age": 25
    },
    "exercises": {
      "squats": [],
      "legpresses": [],
      "deadlifts": [],
      "benchpresses": [],
      "pullups": [],
      "shoulderpress": [],
      "curls": []
    }
  },
  {
    "_id": "5927244c1028840e7b49a5f6",
    "nickname": "mmsmsy",
    "info": {
      "name": "Mateusz",
      "gender": "male",
      "age": 26
    },
    "exercises": {
      "squats": [],
      "legpresses": [],
      "deadlifts": [],
      "benchpresses": [],
      "pullups": [],
      "shoulderpress": [],
      "curls": []
    }
  }
]

And here's the back-end code with requests:

const express = require('express');
const router = express.Router();
const app = express();
const cors = require('cors');
const bodyParser = require('body-parser');
const axios = require('axios');

const monk = require('monk');
const db = require('monk')('localhost/fitness-log');
const users = db.get('users');

app.use(cors());
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({extended: true}));

app.use('/api/v1', router);


router.get('/listusers', (req, res) => {
  users.find()
    .then(users => res.json(users))
});

router.get('/:nickname', (req, res) => {
  users.find({'nickname': req.params.nickname})
    .then(user => res.json(user))
});

router.get('/:nickname/:info', (req, res) => {
  users.find({'nickname': req.params.nickname}, `info.${req.params.info}`)
    .then(user => res.json(user))
});

router.post('/adduser', (req, res) => {
  users.insert(req.body, (err, result) => {
    res.send(
      (err === null) ? { msg: result } : { msg: err }
    );
  });
});

router.put('/addrecord/:nickname/:exercise', (req, res) => {
  users.update({'nickname': req.params.nickname}, {$set: `info.${req.params.info}`}, (err, result) => {
    res.send(
      (err === null) ? { msg: result } : { msg: err }
    );
  });
});

router.delete('/deleteuser/:nickname', (req, res) => {
  users.remove({ 'nickname': req.params.nickname }, err => {
    res.send((err === null) ? { msg: '' } : { msg: 'error: ' + err});
  });
});

router.delete('/deleteallusers', (req, res) => {
  users.remove({}, err => {
    res.send(err === null) ? {msg: '' } : { msg: 'error: ' + err};
  });
});

app.listen(3001, () => console.log("Server running at 3001"));



via Mateusz Mysiak

No comments:

Post a Comment