我正在尝试做一个相对简单的 API,它返回具有 kcal、碳水化合物、蛋白质等的汇总属性的食谱。
所以让我们以一种简单的方式进行布局,目前我有三个模型。
食谱
name: String
ingredients: [{type: mongoose.Schema.Types.ObjectId, ref: 'Ingredient'}]
成分
weightInGrams: Number
nutrient: {type: mongoose.Schema.Types.ObjectId, ref: 'Nutrient'}
养分
name: String
kcalPerHundredGrams: Number
所以假设我想创建一个 1 公斤奶酪的食谱,那么我将有一个名为 Cheese 的营养物质,其 kcalPerHundredGrams 为 493kcal。然后,我创建一个成分,参考我的 Cheese-nutrient 和 weightInGrams 1000。最后一部分是创建 Cheese-recipe,参考我新创建的成分。
所有这一切都很容易完成并且可能。但是,当我使用 Recipe.find() 获取所有食谱时,我希望食谱有一个名为“kcal”的属性,它是该食谱的所有成分 kcal 的总和。
在这种情况下,我们只有一种成分,因此食谱的属性为 kcal,计算结果为 493 * 10 = 4930,因为我的营养成分是每 100g 493kcals,而我的成分是 1kg(10 乘以 100g)。
这是我已经走了多远:
var query = Recipe.aggregate([
{
$lookup: {
from: 'ingredients',
localField: 'ingredients',
foreignField: '_id',
as: 'ingredients'
},
},
{
$addFields: {
weight: {
$sum: '$ingredients.weightInGrams'
}
}
}
]);
这总结了食谱的总重量,效果很好。但是我还想添加所有成分大卡的总和,这意味着我需要查找每种成分的营养素以计算总大卡(营养素 kcalPerHundredGrams 除以 100,然后乘以成分 weightInGrams),我不能似乎了解如何仅针对一个文档(一种成分只有一种营养素)进行这种嵌套查找?