我的子文档中包含每餐的卡路里数。它们存储为包含食物的物体阵列,如下所示:
{
"_id": ObjectId("58f5fde7eecaaf0317185fd2"),
"user_id": ObjectId("58d2dd4c8207c28149dbc748"),
"calories": 2051,
"date": 20170318,
"snacks": [
{
"nutrients": {
"protein": 3.9,
"carbs": 58.3,
"fat": 28.7
},
"servings": 20,
"calories": 426,
"name": "6 toffee terror whirls"
}
],
"dinner": [
{
"nutrients": {
"protein": "4.2",
"carbs": "5.5",
"fat": "27.9"
},
"servings": 47.5,
"calories": 580,
"name": "Summer Recipe Pesto Sweet pepper, Rocket & Mozarella"
}
],
"lunch": [
{
"nutrients": {
"protein": 11.3,
"carbs": 27.3,
"fat": 8.1
},
"servings": 75,
"calories": 730,
"name": "Wood fired rostello ham, chestnut mushrooms & mascarpone 12'' pizza"
}
],
"breakfast": [
{
"nutrients": {
"protein": 12.6,
"carbs": 0.1,
"fat": "9"
},
"servings": "20",
"calories": 110,
"name": "15 eggs from caged hends - class A"
},
{
"nutrients": {
"protein": "31",
"carbs": 0.1,
"fat": "15"
},
"servings": "15",
"calories": 164,
"name": "Smoked thick cut bacon"
}
]
}
我想要做的是将单个用户添加的一天的总卡路里相加,因此将每个食物对象的卡路里量相加。我知道我需要使用$ group和$ sum的聚合方法但是我不确定如何正确使用它。任何帮助都会很感激。
我需要的是每天输入的总卡路里。 例如
20170318:2018 ,20170230:1990
等等
这是我试过的,但它目前无效:
user_food.find({username: req.body.username},{$group:{_id:{date:{$dayOfYear: "$date"}},total:{$sum:'$calories'}}}, function (err, user) {
//if the user exists
if (err) {
console.log("something went wrong: " + err);
return res.status(500).send(err);
} else {
return res.status(200).send(user);
}
});
答案 0 :(得分:0)
$reduce
可以使用$add
运算符进行每次用餐。
db.collection.aggregate(
{$match:{user_id:ObjectId("58d2dd4c8207c28149dbc748")}},
{
$project: {
date:1,
calories: { $add: [ {
$reduce: {
input: "$breakfast",
initialValue: 0,
in: { $add : ["$$value", "$$this.calories"] }
}
}, {
$reduce: {
input: "$lunch",
initialValue: 0,
in: { $add : ["$$value", "$$this.calories"] }
}
},{
$reduce: {
input: "$snacks",
initialValue: 0,
in: { $add : ["$$value", "$$this.calories"] }
}
}, {
$reduce: {
input: "$dinner",
initialValue: 0,
in: { $add : ["$$value", "$$this.calories"] }
}
} ] }
}
}
)
答案 1 :(得分:0)
在按日期和总卡路里之前使用$ unwind,
db.collection.aggregate([{
$match: {
key: value
}
}, {
$unwind: "$snacks"
}, {
$group: {
_id: "$date",
totalCalories: {
$sum: "$calories"
}
}
}])
20170318日的输出将是,
{ "_id" : 20170318, "totalCalories" : 2051 }