2017-05-25 144 views
1

我正在用新記錄更新MongoDB數據庫。數據庫由數組組成的練習字段組成,當我做PUT頭時,我想用新記錄更新特定練習,不要覆蓋特定練習的整個字段,因爲我想保留進度的歷史記錄。到目前爲止,我只能獲取在router.get('/:nickname /:info')中看到的特定嵌套字段,我們可以在其中指定用戶及其名稱,年齡或性別。我可以在練習場上做同樣的事情,但我一直未能更新這些練習場。這裏的數據庫:如何在node.js中用monk更新mongodb中的嵌套字段

[ 
{ 
    "_id": "59283956c52a5420e74966b9", 
    "info": { 
     "nickname": "annwumy", 
     "name": "Bert", 
     "gender": "male", 
     "age": 25 
    }, 
    "exercises": [ 
     { 
     "exercise": { 
      "name": "squats", 
      "records": [] 
     } 
     }, 
     { 
     "exercise": { 
      "name": "legpresses", 
      "records": [] 
     } 
     }, 
     { 
     "exercise": { 
      "name": "deadlifts", 
      "records": [] 
     } 
     }, 
     { 
     "exercise": { 
      "name": "benchpresses", 
      "records": [] 
     } 
     }, 
     { 
     "exercise": { 
      "name": "pullups", 
      "records": [] 
     } 
     }, 
     { 
     "exercise": { 
      "name": "shoulderpress", 
      "records": [] 
     } 
     }, 
     { 
     "exercise": { 
      "name": "curls", 
      "records": [] 
     } 
     } 
    ] 
    }, 
    { 
    "_id": "5928397fc52a5420e74966ba", 
    "info": { 
     "nickname": "mmsmsy", 
     "name": "Mateusz", 
     "gender": "male", 
     "age": 26 
    }, 
    "exercises": [ 
     { 
     "exercise": { 
      "name": "squats", 
      "records": [] 
     } 
     }, 
     { 
     "exercise": { 
      "name": "legpresses", 
      "records": [] 
     } 
     }, 
     { 
     "exercise": { 
      "name": "deadlifts", 
      "records": [] 
     } 
     }, 
     { 
     "exercise": { 
      "name": "benchpresses", 
      "records": [] 
     } 
     }, 
     { 
     "exercise": { 
      "name": "pullups", 
      "records": [] 
     } 
     }, 
     { 
     "exercise": { 
      "name": "shoulderpress", 
      "records": [] 
     } 
     }, 
     { 
     "exercise": { 
      "name": "curls", 
      "records": [] 
     } 
     } 
    ] 
    } 
] 

而這裏的後端代碼的請求:

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('/users/:id', (req, res) => { 
    users.find({'_id': req.params.id}) 
    .then(user => res.json(user[0])) 
}); 

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

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

router.put('/updateinfo/:nickname/:info', (req, res) => { 
    const updateQuery = {$set: {}}; 
    updateQuery.$set[`info.${req.params.info}`] = req.body.value; 
    users.update({'nickname': req.params.nickname}, updateQuery, (err, result) => { 
    res.send(
     (err === null) ? { msg: result } : { msg: err } 
    ); 
    }); 
}); 

router.put('/addrecord/:nickname/:exercise', (req, res) => { 
    const updateQuery = {$push: {}}; 
    updateQuery.$push[`exercises.${req.params.exercise}`] = req.body; 
    users.update({'nickname': req.params.nickname}, updateQuery, (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")); 

回答

1

bug是在更新表達式:

{$set: `info.${req.params.info}`} 

它必須是:

const updateQuery = {$set: {}}; 
updateQuery.$set[`info.${req.params.info}`] = req.params.infoValue; 
users.update({'nickname': req.params.nickname}, updateQuery, (err, result) => { 
+0

偉大的提示。謝謝。我更新了代碼,以便更新特定練習。當我嘗試PUT新紀錄時,它仍會覆蓋練習記錄。我希望它將新記錄存儲在對象數組中的前一個記錄旁邊。儘管你已經建議的那個會很好地更新用戶名,年齡和性別信息。 –

+0

您需要更改文檔結構。將練習更改爲數組,並使用$ push而不是$ set插入新練習 - https://docs.mongodb.com/manual/reference/operator/update/push/ – Elad

+0

您是魔術師。 :)非常感謝您,一旦我在更新查詢中將$ set更改爲$ push,所有內容都可以正常工作。 –