Mongodb创建一个在同一文档中具有多个值之和的字段

时间:2018-03-29 17:52:40

标签: node.js mongodb express mongoose

正如标题所说,我想在一个文档中创建一个函数,该文档将所有硬币总计为mongodb中特定用户的TotalCoins。我找到了$add,但我不知道如何解决这个问题。

PS:我正在使用Mongodb,mongoose nodejs express

我有一个用户集合,其中包含此用户A和其他硬币获得的硬币,以及此用户A推荐的其他用户的百分比。

所以用户架构看起来像这样

{
    "_id": {
        "$oid": "5abcbee7ff1e4849b8f642b5"
    },
    "name": "test1",
    "email": "test1@gmail.com",
    "username": "test1",
    "password": "$2a$10$/Y6Gns8OPsp8eudVBrfUx.clwNwixAmeqhVzBYKUyNuoGcR3XQP8e",
    "joindate": "29/03/2018 11:24",
    "lastdailybonus": "28/03/2018 11:24",
    "profileimgurl": "img.jpg",
    "referralUrl": "r1xk1rq5g",
    "referredBy":"syiqyb9cz",
    "referredUsers": [
        {
            "id": {
                "$oid": "5abcbf29ff1e4849b8f642b6"
            },
            "coins": 50
        },
        {
            "id": {
                "$oid": "5abcbf9b9a3ca4425489777e"
            },
            "coins": 76
        }
    ],
    "completedMissions": [],
    "coinsEarned":1500,
    "__v": 2
}

我希望有一个新的字段TotalCoins,它可以在referUsers数组中添加CoinsEarned和硬币的总和(遍历数组并对硬币求和)当用户引用新朋友时,可以扩展此数组。有可能实现这个操作吗?这很复杂,如果不可能,你还有其他选择吗? :)感谢您的时间

更新

使用聚合:它与你们在下面发布的代码相同,但有一些修改。不幸的是,它不起作用:/新的totalCoins还没有在数据库中。

var User = require('../models/users');

User.aggregate([{
            $addFields: {
                totalCoins: {
                    $reduce: {
                        input: "$referredUsers",
                        initialValue: 0,
                        in: { $add : ["$$value", "$$this.coins"] }
                    }
                  }
                }
             },
             {$addFields:{totalCoins:{$add:["$totalCoins","$coinsEarned"]}}},
             {$out: "users"}
    ])

1 个答案:

答案 0 :(得分:0)

试试这个:

db.sample.aggregate([
{
    $addFields: {
        totalCoins: {
            $reduce: {
                input: "$referredUsers",
                initialValue: 0,
                in: { $add : ["$$value", "$$this.coins"] }
            }
          }
        }
     },
     {$addFields:{totalCoins:{$add:["$totalCoins","$coinsEarned"]}}},
     {$out: "sample"}
])