【问题标题】:Mongoose using $push on an array field overwrites last entryMongoose 在数组字段上使用 $push 会覆盖最后一个条目
【发布时间】:2018-07-10 17:07:08
【问题描述】:

我正在尝试在 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);
    });  
}

【问题讨论】:

  • 试试 $pushAll

标签: node.js mongodb express mongoose tabulator


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-03-22
    • 1970-01-01
    • 2010-09-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-20
    相关资源
    最近更新 更多