如何从嵌套字段中获取数组的总和 ($sum)?

How can I get the total sum ($sum) of an array from a nested field?

我需要架构中嵌套的数组中所有元素的总和。 这是架构:

const mongoose = require('mongoose');

let historySchema = new mongoose.Schema({
    time: {
        type:String
    }
})

//users schema

let userSchema = new mongoose.Schema({
    name:{
        type:String,
        
    },
    dob:{
        type:String,
        
    },
    email:{
        type:String,
        
    },
    noOfpeopleClimbing:{
        type: Number,
        default:0
    },
    details:{
        type:String,
        
    },
    status:{
        type: Boolean,
        default: false
    },
    timeIn:{
        type: Number,
        default: 0
    },
    timeOut:{
        type: Number,
        default: 0
    },
    timeFinal:{
        type: Number,
        default: 0
    },
    history:[{
        
        time:{
            type: Number
        },
        date:{
            type:Date,
            default:Date.now()
        },
        climbers:{
            type: Number
        },
        names:{
            type: String
        }
    }]
})
let User = module.exports = mongoose.model("User", userSchema);

讨论中的嵌套字段是:

history:[{
    time:{
        type: Number
}]

查找方法是:

app.get('/user/:id', function(req,res){

    Users.findById(req.params.id, function(err, users){

        res.render("user",
        {
        title:users.name,
        users:users,
        });
    })
})

我可以在我的查找路径上附加一个带有 $sum 的聚合,以便我将带有总和的数据发送到我的渲染视图吗?

例如totalTimeHistory:$sum aggregate data.

使用下面的代码片段:

const result = Users.aggregate([
{
   $match: {
     //Your find block here
   }
},
{
    $unwind: "$history"
},
{
    $project: {
        totalTimeHistory: { $sum: "$history.time"}
    }
}
])

试试这个查询:

db.collection.aggregate([
  {
    "$match": {
      "name": "name" //or whatever you want
    }
  },
  {
    "$project": {
      "total": {
        "$sum": "$history.time"
      }
    }
  }
])

这样就不需要$unwind

示例here

db.getCollection('users').aggregate([
{
    $match: {
        <your find query goes here>
    }
},
{
    $unwind: '$history'
},
{
    $group: { 
        _id: <your user object id (or) null>, 
        history: { $push: "$$ROOT.history" }
    }
},
{
    $addFields: {
        totalSumOfHistoryTypes: { $sum: "$history.type" }
    }
},

])

你的输出看起来像

解释:

$match: 在集合中查找

$unwind: 展开历史数组,以便对历史值进行分组

$group:这里我们创建了一个名为 history 的数组,并将历史对象 ($$ROOT.history) 压入其中

$addFiled:用于添加模式中不存在的新字段

希望这解释了干杯