我在nodejs的mongodb查询中需要帮助

时间:2017-11-13 14:29:32

标签: mongodb mongodb-query

查询返回双值,你能帮帮我吗? 问题是放松吗?

是一项合并数据库的借方和贷方的咨询......

汇总......

代码:

我的DAO(MongoDB + NodeJS):

ListarDebitosDAO.prototype.consolidado = function(usuario,res,req){

this._connection.open(function(err, mongoclient){
    mongoclient.collection("contas", function(err, collection){
        collection.aggregate([{
            $match : {usuario : usuario}},{
            $unwind: "$debitos" 
        },{
            $unwind: "$creditos"
        }, {
            $group: {
                "_id" : usuario,
                "debitos": {
                    $sum: "$debitos.debito"
                },
                "creditos" : {
                    $sum: "$creditos.credito"
                }

            }
        }])
        .toArray(function(error, results){

            console.log(results)

            var debitoConsolidado = results[0].debitos;
            var creditoConsolidado = results[0].creditos;



            res.render('dashboard', {debitoConsolidado,nome_usuario: req.session.nome,creditoConsolidado})

        });
        // mongoclient.close();
    });
});  

}

我的收藏(例如):

{
"_id" : ObjectId("5a09113b42e54fb49230fa37"),
"usuario" : "sara",
"creditos" : [
    {
        "nome_do_credito" : "credito inicial",
        "credito" : 0
    },
    {
        "nome_do_credito" : "salario",
        "credito" : 1200
    }
],
"debitos" : [
    {
        "nome_do_debito" : "debito inicial",
        "debito" : 0
    },
    {
        "nome_do_debito" : "Vivo",
        "debito" : 200
    },
    {
        "nome_do_debito" : "Vivo",
        "debito" : 600
    }
]

}

我的原始输出:

{ "_id" : null, "debitos" : 1600, "creditos" : 3600 }

我需要:

{ "_id" : null, "debitos" : 800, "creditos" : 1200 }
enter code here

2 个答案:

答案 0 :(得分:0)

问题是你试图同时使用两个展开,它正在创建重复的条目,因此信用卡和借记卡的总和出错了。

我想你可以做的是对信用卡和借记卡进行顺序展开和分组

collection.aggregate([{
        $match : {usuario : usuario}},{
        $unwind: "$debitos" 
    }, {
        $group: {
            "_id" : usuario,
            "debitos": {
                $sum: "$debitos.debito"
            },
            "creditos" : "$creditos"
        }
    },
    {
        $unwind: "$creditos"
    },
    {
        $group: {
            "_id" : usuario,
            "creditos" : {
                $sum: "$creditos.credito"
            }
            "debitos": "$debitos"
        }
    }
])

我确信这个或某个变体应该适合你。

答案 1 :(得分:0)

可以这么简单:

    db.contas.aggregate([
     {
       $project: {
         _id: 1,
         usario: 1,
         debitos: {
           $reduce: {
             input: "$debitos",
             initialValue: 0,
             in: { $add: [ "$$value", "$$this.debito" ] }
           }
         },
         creditos: {
           $reduce: {
             input: "$creditos",
             initialValue: 0,
             in: { $add: [ "$$value", "$$this.credito" ] }
           }
         }
       }
     }
    ]);

您只需使用一个投影,并通过对其成员求和来减少数组。