文档未在mongodb中正确更新

时间:2016-12-28 04:58:38

标签: node.js mongodb

我的mongodb文件如下所示。

{"studid":"123", "name":"abc"}

我想更新此文档如下。

{"studid":"123", "name":"abc", "class":"five", "sec":"b"}

为了达到这个目的,我编写了如下代码并将查询和字段传递为。

名称 - "studreg",查询 - {"studid":"123"}和字段 - "class":"five", "sec":"b"

exports.modify = function(name,query,field) {
    return new Promise(function(resolve,reject){
        var updateStr = '{$set:{'+field+'}}';
        console.log('updateStr: ' + updateStr);
        dbase.collection(name,function(err,table){
            table.findAndModify(query,[[_id,desc]],updateStr,{w:1, new:true},function(err,result){
                if (err) reject(err);
                else
                    resolve(result);
            });
        });
    });
};

作为输出,当我调用modify方法时,我的浏览器窗口上会显示以下消息。

{"lastErrorObject":{"updatedExisting":true,"n":1},"value":{"_id":"585ce7d9bef96722642adfeb"},"ok":1}

在数据库中,当我尝试查找文档时,它只显示id字段而不显示任何其他字段。你能让我知道我在哪里做错了吗?

3 个答案:

答案 0 :(得分:1)

来自Foreign Exchange Rates

它表示update字段必须是对象,而不是您使用的string

因此,您的输入字段必须为field- {"class":"five", "sec":"b"}

试试这个

exports.modify = function(name,query,field) {
    return new Promise(function(resolve,reject){
        var updateObj = {$set: field}; //field must be object
        console.log('updateStr: ' + updateStr);
        dbase.collection(name,function(err,table){
            table.findAndModify(query,[['_id','desc']],updateObj,{upsert: true},function(err,result){
                if (err) reject(err);
                else
                    resolve(result);
            });
        });
    });
};

还有一件事我没有看到_id,这是您mongodb documentdocument的必填字段。

答案 1 :(得分:0)

我认为Jyothi的分析是正确的,但是该字段以字符串形式出现,需要转换为对象。在我看来,只需创建有问题的updateStr,然后使用JSON.parse(updateStr)获取该对象的版本。

exports.modify = function(name,query,field) {
    return new Promise(function(resolve,reject){
        var updateStr = '{$set:{'+field+'}}';
        console.log('updateStr: ' + updateStr);
        var updateObj = JSON.parse(updateStr);
        dbase.collection(name,function(err,table){
            table.findAndModify(query,[[_id,desc]],updateObj,{w:1, new:true},function(err,result){
                if (err) reject(err);
                else
                    resolve(result);
            });
        });
    });
};

事实上它正在删除所有其他变量,但是_id只是证明了你的updateStr没有按原样被解析。

答案 2 :(得分:0)

问题解决了。正如Rahul所说,问题在于解析updateStr。当我在调用方法时使用JSON.parse('{\“$ set \”:{'+ field +'}}')和JSON.parse(查询)时,我得到了预期的结果。