如何使用Node.js和Mongoose

时间:2016-12-13 10:43:07

标签: node.js mongodb mongoose mongodb-query

我已经写了获取所有用户记录的查询

exports.index = function(req, res) {
    Userdata.find(function(err, userdatas) {
        if (err) {
            return handleError(res, err);
        }

        console.log(userdatas);

    });

};

控制台我收到文件

{
    "_id" : ObjectId("584bc9ba420a6b189c510af6"),
    "user_id" : 1,
    "price" : 2000.0,
    "type" : "credit",

},
{
    "_id" : ObjectId("584bc9ba420a6b189c510af7"),
    "user_id" : 1,
    "price" : -1000.0,
    "type" : "credit",

},
{
    "_id" : ObjectId("584bc9ba420a6b189c510af8"),
    "user_id" : 2,
    "price" : 1000.0,
    "type" : "credit",

}

现在我想计算总正数,总负数和总和(总正数 - 总负数)

一旦计算出我需要在汇总集合中插入/更新

如果用户ID已在摘要集合中显示,那么我们需要更新特定用户文档

如果用户ID不存在,我们需要为该用户创建新文档

此处摘要集合已经存在user_id = 1,因此我们需要更新此文档,而user_id = 2不在摘要集合中,因此我们需要创建。

    {
        "_id" : ObjectId("584bc9ba420a6b189c510af9"),
        "user_id": 1,
        "Totalpositiveprice": 3000.0,
        "Totalnegativeprice": 0,
        "Balanceprice": 3000.0
    },
{
        "_id" : ObjectId("584bc9ba420a6b189c510af9"),
        "user_id": 3,
        "Totalpositiveprice": 200.0,
        "Totalnegativeprice": -190,
        "Balanceprice": 10.0
    }

我的期望结果:

    {
        "_id" : ObjectId("584bc9ba420a6b189c510af9"),
        "user_id": "1",
        "Totalpositiveprice": 5000.0,
        "Totalnegativeprice": -1000.0,
        "Balanceprice": 4000.0
    },
    {

        "user_id": "2",
        "Totalpositiveprice": 1000.0,
        "Totalnegativeprice": 0,
        "Balanceprice": 1000.0
    },
   {
        "_id" : ObjectId("584bc9ba420a6b189c510af9"),
        "user_id": 3,
        "Totalpositiveprice": 200.0,
        "Totalnegativeprice": -190,
        "Balanceprice": 10.0
    }

一旦计算出我需要在汇总集合中插入/更新

2 个答案:

答案 0 :(得分:2)

考虑到预期结果是数字,db.getCollection('userpricing').aggregate([ {$group: { _id:"$user_id", user_id: {$first: "$user_id"}, Totalpositiveprice:{$sum:{$cond:[{ '$gt': ['$price', 0]}, "$price", 0]}}, Totalnegativeprice:{$sum:{$cond:[{ '$lt': ['$price', 0]}, "$price", 0]}}, Balanceprice:{"$sum":"$price"}} }, { $lookup: { from: "summary", localField: "user_id", foreignField: "user_id", as: "user_id2" } }, {$project: { _id:0, user_id:1, Totalpositiveprice: {$sum: ["$Totalpositiveprice", {$sum: "$user_id2.Totalpositiveprice"}] }, Totalnegativeprice: {$sum: ["$Totalnegativeprice", {$sum: "$user_id2.Totalnegativeprice"}] }, Balanceprice: {$sum: ["$Balanceprice", {$sum: "$user_id2.Balanceprice"}] }, }}, {$out: "summary"} ]).pretty() 集合中的值是数字(否则你需要使它们成为数字)这里是一个计算结果的聚合:

db.summary.find().pretty()

{
    "_id" : ObjectId("584fde2906c7385883be0d15"),
    "user_id" : 2,
    "Totalpositiveprice" : 10000,
    "Totalnegativeprice" : 0,
    "Balanceprice" : 10000
}
{
    "_id" : ObjectId("584fde2906c7385883be0d16"),
    "user_id" : 1,
    "Totalpositiveprice" : 23000,
    "Totalnegativeprice" : -10000,
    "Balanceprice" : 13000
}

结果:

SELECT * FROM mytable WHERE dt = <??? infitity ???> OR dt = <??? -infinity ???>

稍后,如果需要,您需要将它们转换为字符串。

注意:  结果它会使用新的计算(和更新)值覆盖摘要集合。 最好先测试你的结果。

答案 1 :(得分:1)

我假设你的summaryCollection中的字段是数字。您可以遍历userData并在摘要集合中修改或创建用户。我已添加到您现有的代码中:

pip install boto3
pip install django-storages==1.5.1  --> only version 1.5 and above have boto3 support.