如何在mongodb中加入$ lt和$ divide

时间:2015-06-01 20:45:17

标签: mongodb aggregation-framework

我是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中可能

谢谢。

1 个答案:

答案 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卡。