如何从嵌套字段中获取数组的总和 ($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:用于添加模式中不存在的新字段
希望这解释了干杯
我需要架构中嵌套的数组中所有元素的总和。 这是架构:
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:用于添加模式中不存在的新字段
希望这解释了干杯