Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/video/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mongodb 基于其他集合数据更新mongo字段_Mongodb_Mongodb Update - Fatal编程技术网

Mongodb 基于其他集合数据更新mongo字段

Mongodb 基于其他集合数据更新mongo字段,mongodb,mongodb-update,Mongodb,Mongodb Update,我正在寻找一种基于另一个集合的数据总和来更新字段的方法 我试着带上所有的饭菜,用forEach给每顿饭的产品集合打电话,测试它是否有效,但我得到了一个暂停 meals.find().forEach(meal => { var products = db.Products.find( { sku: { $in: meal.products } }, { _id: 1, name: 1, sku: 1, nutritional_facts: 1 }

我正在寻找一种基于另一个集合的数据总和来更新字段的方法

我试着带上所有的饭菜,用forEach给每顿饭的产品集合打电话,测试它是否有效,但我得到了一个暂停

meals.find().forEach(meal => {
    var products = db.Products.find(
        { sku: { $in: meal.products } },
        { _id: 1, name: 1, sku: 1, nutritional_facts: 1 }
    )
    printjson(products)
})
我的目标是执行下面这样的操作以获得所需的结果,但我得到了“SyntaxError:invalid for/in left-side”。不能在mongo查询中使用

db.Meals.find({}).forEach(meal => {

    const nutri_facts = {};

    db.Products.find({ sku: { $in: meal.products } }, 
    { _id: 1, name: 1, sku: 1, nutri_facts: 1 }).forEach(product => {
        for (let nutriFact in product.nutri_facts) {
            nutri_facts[nutriFact] =
                    parseFloat(nutri_facts[nutriFact]) +
                    parseFloat(product.nutri_facts[nutriFact]);
            }
        }
    });

    for (let nutriFact in nutri_facts) {
            meal.nutri_facts[nutriFact] = 
            nutri_facts[nutriFact];
        }
    }

    db.Meals.updateOne({ _id: meal._id }, meal)
});
在本例中,我也很难找到如何使用聚合和查找,但没有成功

有可能吗

示例-膳食文件

{
  _id: ObjectId("..."),
   products : ["P068","L021","L026"], //these SKUs are part of this meal
   nutri_facts: {
    total_fat: 5g,
    calories: 100kcal
    (...other properties)
   }
}
{
  _id: ObjectId("..."),
   sku: 'A010'
   nutri_facts: {
    total_fat: 2g,
    calories: 40kcal
    (...other properties)
   }
}
对于每顿饭,我需要使用“sku”字段在“产品”集合中查找其产品。 然后我将所有产品的营养成分相加,得到膳食营养成分

示例产品文档

{
  _id: ObjectId("..."),
   products : ["P068","L021","L026"], //these SKUs are part of this meal
   nutri_facts: {
    total_fat: 5g,
    calories: 100kcal
    (...other properties)
   }
}
{
  _id: ObjectId("..."),
   sku: 'A010'
   nutri_facts: {
    total_fat: 2g,
    calories: 40kcal
    (...other properties)
   }
}
我知道在这种情况下,mongo可能不是最好的选择,但整个应用程序已经使用它构建

对于每顿饭,我需要在“产品”上查找其产品 使用“sku”字段的集合。然后我将总结营养事实 所有的产品都能得到膳食营养的事实


注意事项:

  • 我使用变量
    nutri\u facts\u var
    name(变量
    var
    后缀)来 我们可以很容易地将用户定义的变量名与 文档字段的名称
  • {{u id:1,name:1,sku:1,nutri_facts:1}更改为{ 营养事实:1}。默认情况下,
    \u id
    包含在 投影。不需要字段
    name
    sku
  • db.fines.updateOne({u-id:fine.\u-id},fine)
    不是正确的 语法。更新操作使用。 更正的代码:
    db.fines.updateOne({u id:fine.\u id},{$set:
    {nutri_facts:nutri_facts_v}})
    。请注意,我们正在更新 仅nutifacts,并非所有细节
  • 由于单个nutrifacts存储为字符串(例如。, “100kcal”),在算术过程中,字符串部分被剥离。所以,我们 为每个nutrifact和 在算术之后附加它。下面的代码带和 存储单位部分:
    let units=
    (product.nutri_facts[nutriFact].split(/\d+/).pop()
  • 使用mongo shell方法
    print
    printjson
    打印 分别为变量或对象的内容-用于调试 目的
  • 注意:即使
    nutri_facts
    字段未在其中定义,查询也会更新
    deal
    集合;
    $set
    更新操作符创建新字段,并在字段不存在时设置值

    对于每顿饭,我需要在“产品”上查找其产品 使用“sku”字段的集合。然后我将总结营养事实 所有的产品都能得到膳食营养的事实


    注意事项:

  • 我使用变量
    nutri\u facts\u var
    name(变量
    var
    后缀)来 我们可以很容易地将用户定义的变量名与 文档字段的名称
  • {{u id:1,name:1,sku:1,nutri_facts:1}更改为{ 营养事实:1}。默认情况下,
    \u id
    包含在 投影。不需要字段
    name
    sku
  • db.fines.updateOne({u-id:fine.\u-id},fine)
    不是正确的 语法。更新操作使用。 更正的代码:
    db.fines.updateOne({u id:fine.\u id},{$set:
    {nutri_facts:nutri_facts_v}})
    。请注意,我们正在更新 仅nutifacts,并非所有细节
  • 由于单个nutrifacts存储为字符串(例如。, “100kcal”),在算术过程中,字符串部分被剥离。所以,我们 为每个nutrifact和 在算术之后附加它。下面的代码带和 存储单位部分:
    let units=
    (product.nutri_facts[nutriFact].split(/\d+/).pop()
  • 使用mongo shell方法
    print
    printjson
    打印 分别为变量或对象的内容-用于调试 目的

  • 注意:即使
    nutri_facts
    字段未在其中定义,查询也会更新
    deal
    集合;
    $set
    更新操作符创建新字段,并在字段不存在的情况下设置值。

    谢谢!!在本例中,我的问题是我在nutri_facts中有很多属性,因此我认为使用循环会更好,但它不起作用。你知道这是否可能吗?考虑到我使用for/in生成的查询,我更新了问题。我对代码进行了更改。学习笔记和代码以理解。非常感谢您的详细解释。这很有帮助!谢谢在本例中,我的问题是我在nutri_facts中有很多属性,因此我认为使用循环会更好,但它不起作用。你知道这是否可能吗?考虑到我使用for/in生成的查询,我更新了问题。我对代码进行了更改。学习笔记和代码以理解。非常感谢您的详细解释。这很有帮助!