MongoDB的创建具有多个值的同一文档内的总和场

问题描述 投票:0回答:1

正如标题说,我想打一个函数,总结所有的硬币到TotalCoins在MongoDB的特定用户的文件内。我发现$add,但我不知道如何与它解决的问题。

PS:我使用MongoDB的,猫鼬表达的NodeJS

我有一个用户采集具有由该用户和其他钱币与其他用户的百分比得到了由该用户A.简称获得硬币

因此,用户模式是这样的

{
    "_id": {
        "$oid": "5abcbee7ff1e4849b8f642b5"
    },
    "name": "test1",
    "email": "[email protected]",
    "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这增加CoinsEarned和硬币的总和referredUsers阵列中(通过遍历数组,总结硬币),当用户参考新朋友该阵列可以延长。是有可能实现这个操作?它是复杂的,如果它是不可能的,你有什么办法? :) 谢谢你的时间

UPDATE

使用聚合:这是你们下面贴,但与一些修改相同的代码。不幸的是,这是行不通的:/新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"}
    ])
node.js mongodb express mongoose
1个回答
0
投票

尝试这个:

db.sample.aggregate([
{
    $addFields: {
        totalCoins: {
            $reduce: {
                input: "$referredUsers",
                initialValue: 0,
                in: { $add : ["$$value", "$$this.coins"] }
            }
          }
        }
     },
     {$addFields:{totalCoins:{$add:["$totalCoins","$coinsEarned"]}}},
     {$out: "sample"}
])
© www.soinside.com 2019 - 2024. All rights reserved.