Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/33.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Json 聚合方法未获取更新的数据MongoDB_Json_Node.js_Mongodb - Fatal编程技术网

Json 聚合方法未获取更新的数据MongoDB

Json 聚合方法未获取更新的数据MongoDB,json,node.js,mongodb,Json,Node.js,Mongodb,因此,当我发出删除请求时,我正在更新我的模型并删除所选的数组项。然后我通过ajax将更新后的JSON数据发送回来。我使用聚合方法来确定数组中所选值的总和,但问题是聚合方法基于删除列表项之前可用的数据返回数据,即使我将其放入回调中。那么我怎样才能得到正确的更新总数呢?以下是我正在使用的代码: regUser.findOneAndUpdate( { username:req.user.username }, { $pull: { budgets : { uniqueId: parse

因此,当我发出删除请求时,我正在更新我的模型并删除所选的数组项。然后我通过ajax将更新后的JSON数据发送回来。我使用聚合方法来确定数组中所选值的总和,但问题是聚合方法基于删除列表项之前可用的数据返回数据,即使我将其放入回调中。那么我怎样才能得到正确的更新总数呢?以下是我正在使用的代码:

regUser.findOneAndUpdate(
    { username:req.user.username },
    { $pull: { budgets : { uniqueId: parseFloat(req.param('id')) }} }, 
    function(err, data){
        if(err) return console.log(err);
        regUser.aggregate([
            { $match : { username : req.user.username } },
            // Unwind the array to de-normalize the items
            { "$unwind": "$budgets" },
                // Group the totals with conditions
            { "$group": {
                "_id": "$_id",
                "expense": { "$sum": { 
                    "$cond": [
                        "$budgets.expense",
                        "$budgets.value",
                        0
                    ]
            }},
                "nonExpense": { "$sum": { 
                    "$cond": [
                        "$budgets.expense",
                        0,
                        "$budgets.value"
                    ]
            }}
            }}], function(err, aggData){
                sumData = aggData
        });
        res.json({
            sumData: sumData,
            budgetList: data.budgets
        });
});
异步编程:明白了。移动:

在regUser.aggregate回调函数中

function(err, aggData){
   res.json({
        sumData: aggData,
        budgetList: data.budgets
    });
});

有趣。那么,为什么将响应放在聚合回调函数中时它会起作用,而不是我使用的方式呢?这是事件循环在节点中的工作方式。当编译器读取这些函数时,它们不会被执行。它们已计划,也就是添加到事件循环列表中。一旦发生这种情况,节点编译器将传递一个消息,以查看下一个要执行的列表顶部的人。因为它是单线程事件循环,所以一次只执行一个。
function(err, aggData){
   res.json({
        sumData: aggData,
        budgetList: data.budgets
    });
});