我是MongoDB的新手,但我正在尝试查询以确定我的任何字段是否符合要求。
请考虑以下事项:
我有一个集合,其中EACH文档的格式为:
{
"nutrition" : [
{
"name" : "Energy",
"unit" : "kcal",
"value" : 150.25,
"_id" : ObjectId("fdsfdslkfjsdf")
}
{---then there's more in the array---}
]
"serving" : 4
"id": "Food 1"
}
我当前的代码看起来像这样:
db.recipe.find(
{"nutrition": {$elemMatch: {"name": "Energy", "unit": "kcal", "value": {$lt: 300}}}},
{"id":1, _id:0}
)
在阵列营养下,有一个名为Energy的字段,其值为数字。它检查该值是否小于300并输出满足此要求的所有文档(我只输出名为id的字段)。
现在我的问题如下:
1)对于每个文档,我有另一个名为" serve"我应该找出"值" /"服务"仍然低于300.(如通过服务分红,看它是否仍然低于300)
2)因为我正在使用.find,我猜我不能从聚合中使用$ divide运算符?
3)我一直试图使用$ divide + $ cond这样的聚合运算符,但到目前为止还没有运气。
4)通常在其他语言中,我只是创建一个变量a = value / serving然后通过if语句运行它来检查它是否小于300但我不确定是否这样做在MongoDB中可能
谢谢。
答案 0 :(得分:0)
如果有人遇到类似的问题,我想出了如何做到这一点。
db.database.aggregate([
{$unwind: "$nutrition"}, //starts aggregation
{$match:{"nutrition.name": "Energy", "nutrition.unit": "kcal"}}, //breaks open the nutrition array
{$project: {"Calories per serving": {$divide: ["$nutrition.value", "$ingredients_servings"]}, //filters out anything not named Energy and unit is not kcal, so basically 'nutrition' array now has become a field with one data which is the calories in kcal data
"id": 1, _id:0}}, //show only the food id
{$match:{"Calories per serving": {$lt: 300}}} //filters out any documents that has their calories per serving equal to or greater than 300
]}
基本上,您打开数组并过滤掉文档中不需要的任何子字段,然后使用项目以及需要完成的任何数学评估来显示它。然后你过滤掉你的任何条件,对我而言,我不希望看到任何食物的每份食物的热量超过300卡。