猫鼬在数组字段上使用$ push会覆盖最后一个条目

时间:2018-07-10 17:07:09

标签: node.js mongodb express mongoose tabulator

我正在尝试在mongodb记录上创建事件日志类型的字段,我可以在其中存储活动列表。我第一次运行该函数时,它会正确地追加到数组,但随后的调用会覆盖最后一个条目,而不是追加。如果重新启动服务器或刷新浏览器中的页面,它将再次追加并重复相同的行为。 我正在学习node和javascript,所以我确定这是我犯的一些错误,但我似乎无法弄清楚。

客户端上的Javascript是制表符事件。

cellEdited:function(cell){
    //cell - cell component
    const oldValue = cell.cell.oldValue;
    const newValue = cell.cell.value;
    const title = cell.cell.column.definition.title;
    var report = cell.cell.row.data;

    report.event = `Updated ${title} from ${oldValue} to ${newValue}`;

    $.ajax({
        type: 'POST',
        url: '/api/update',
        data: report,
        dataType: 'json'
    });            
}

其在服务器上调用的路由:

app.post('/api/update', isAuthenticated, function(req, res) {
    var report = req.body;
    var reason = '';
    if (typeof report.event !== 'undefined') {
        reason = report.event;
        delete report.event;
    } else {
        reason = 'Report updated';
    }

    db.DamageReport.findOneAndUpdate({ _id: report._id}, report, function (err, doc) {
        if (err) {
            console.log('Err updating report ', err);
            return res.send(500, { error: err});
        }
        /*
        *   Write eventlog
        */
        var event = {"date": new Date(), "user": req.user.email, "event": reason };
        appendLog(doc._id, event);

        return res.json(doc);
    });
});

appendLog函数:

function appendLog(id, entry) {
    /*
    *       entry format:
    *           date: Date
    *           user: String
    *           event: String
    */

    if (typeof(entry.date) !== 'object') {
        entry.date = new Date();
    }

    db.DamageReport.findByIdAndUpdate(id, {$push: {eventLog: entry}}, function(err, result) {
        if (err) {
            return console.log('Error writing eventLog: ', err);
        }
        return(result);
    });  
}

1 个答案:

答案 0 :(得分:0)

它不会追加多个,因为先前的保存以原始形式包含Eventlog数组,因此,每次保存时,它都会将其设置回原始数组,然后附加上一次更新。