如何使用nodejs和mongo客户端更新mongodb中保存的记录?

时间:2018-02-19 09:30:56

标签: json node.js mongodb express

在mongodb中保存日期

{
        "_id" : ObjectId("5a8a95c431789513bc542334")
        "projectName" : "MMMMM",
        "testCases" : [ 
            {
                "groupName" : "Data Validation Bucket 19"
            },
            {
                "groupName" : "Test"
            }
        ]
    }

JSON请求

{
    "_id" : "5a8a95c431789513bc542334",
    "updateData" : {
        "projectName": "MMMMM",
        "testCases": [
          {
            "groupName": "Data Validation Bucket 19"
          },
          {
            "groupName": "Data Validation Bucket 123"
          }
         ]  
    }
}

Nodejs代码

module.exports.update = function (data, callback) {
    var connection = myDB.get();
    var id = data._id;
    var dataToUpdate = data.updateData;

    var reponse = {
        'status' : ''
    }

    if(id) {
        console.log(id);
        console.log(dataToUpdate);
        connection.collection('REPORTS').update({_id : id}, {$set:dataToUpdate}, (err, result) => {
            if (err) {
                console.log(err);
                reponse.status = constantsUtils.ERROR;
                callback(reponse);
            } else {
                reponse.status = constantsUtils.UPDATE_SUCCESS;
                callback(reponse);                
            }
        });
    } else {
        reponse.status = constantsUtils.INVALID_INPUT;
        callback(reponse);
    }
};

我正在尝试使用nodejs和mongoclint更新mongodb中保存的记录。 我正在使用nodejs restful webservice并且请求已成功提供但无法更新moongodb中的记录。

我正在尝试更新 projectName testCases [1] .groupName

1 个答案:

答案 0 :(得分:1)

使用 $addToSet 运算符进行数组更新,因为它允许您向数组添加值,除非该值已存在,在这种情况下 $addToSet 对该数组没有任何作用。对于其他非数组字段, $set 就足够了。

考虑将您的方法重构为

const { ObjectId } = require('mongodb'); 
const safeObjectId = s => ObjectId.isValid(s) ? new ObjectId(s) : null;

module.exports.update = function (data, callback) {
    let collection = myDB.get().collection('REPORTS'),
        query = {},
        update = {},
        id = data._id,
        dataToUpdate = data.updateData,
        response = { 'status' : '' };

    const handleError = err => {
        console.error(err);
        reponse.status = constantsUtils.ERROR;
        callback(reponse);
    }

    const handleSuccess = res => {
        console.log(res);
        reponse.status = constantsUtils.UPDATE_SUCCESS;
        callback(reponse);
    }

    const handleInvalidInput = () => {
        reponse.status = constantsUtils.UPDATE_SUCCESS;
        callback(reponse);
    }       

    if ( id ) {
        query['_id'] = { '_id': safeObjectId(id) };
        update['$set'] = { 'projectName': dataToUpdate.projectName };

        if( Object.prototype.toString.call( dataToUpdate.testCases ) === '[object Array]' ) {
            update['$addToSet'] = { 'testCases': { '$each': dataToUpdate.testCases  } };
        }

        collection.findOneAndUpdate(
            query, 
            update, 
            { returnOriginal: false }
        ).then(handleSuccess, handleError);

    } else {
        handleInvalidInput();
    }
};