正如标题所说,我想在一个文档中创建一个函数,该文档将所有硬币总计为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"}
])
答案 0 :(得分:0)
试试这个:
db.sample.aggregate([
{
$addFields: {
totalCoins: {
$reduce: {
input: "$referredUsers",
initialValue: 0,
in: { $add : ["$$value", "$$this.coins"] }
}
}
}
},
{$addFields:{totalCoins:{$add:["$totalCoins","$coinsEarned"]}}},
{$out: "sample"}
])