【问题标题】:How to update a record saved in mongodb using nodejs and mongo client?如何使用 nodejs 和 mongo 客户端更新保存在 mongodb 中的记录?
【发布时间】:2018-02-19 09:30:55
【问题描述】:

在 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中存在的记录。

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

【问题讨论】:

    标签: json node.js mongodb express


    【解决方案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();
        }
    };
    

    【讨论】:

    • 我收到safeObjectId is not defined 错误。所以它是一种内置方法还是需要创建它?
    • @SangramBadi 它已经定义在代码 sn-p 的顶部,就在 module.exports 之前。您可以在函数中移动它或使用这些帮助方法创建一个帮助文件,因为您需要该函数将字符串 _ids 转换为 ObjectIds
    猜你喜欢
    • 2021-02-02
    • 2015-10-17
    • 2013-03-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-05
    • 1970-01-01
    相关资源
    最近更新 更多