Mongodb 基于其他集合数据更新mongo字段
我正在寻找一种基于另一个集合的数据总和来更新字段的方法 我试着带上所有的饭菜,用forEach给每顿饭的产品集合打电话,测试它是否有效,但我得到了一个暂停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 }
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
包含在
投影。不需要字段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,并非所有细节let units=
(product.nutri_facts[nutriFact].split(/\d+/).pop()
print
和printjson
打印
分别为变量或对象的内容-用于调试
目的nutri_facts
字段未在其中定义,查询也会更新deal
集合;$set
更新操作符创建新字段,并在字段不存在时设置值
对于每顿饭,我需要在“产品”上查找其产品
使用“sku”字段的集合。然后我将总结营养事实
所有的产品都能得到膳食营养的事实
注意事项:
nutri\u facts\u var
name(变量var
后缀)来
我们可以很容易地将用户定义的变量名与
文档字段的名称\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,并非所有细节let units=
(product.nutri_facts[nutriFact].split(/\d+/).pop()
print
和printjson
打印
分别为变量或对象的内容-用于调试
目的注意:即使
nutri_facts
字段未在其中定义,查询也会更新deal
集合;$set
更新操作符创建新字段,并在字段不存在的情况下设置值。谢谢!!在本例中,我的问题是我在nutri_facts中有很多属性,因此我认为使用循环会更好,但它不起作用。你知道这是否可能吗?考虑到我使用for/in生成的查询,我更新了问题。我对代码进行了更改。学习笔记和代码以理解。非常感谢您的详细解释。这很有帮助!谢谢在本例中,我的问题是我在nutri_facts中有很多属性,因此我认为使用循环会更好,但它不起作用。你知道这是否可能吗?考虑到我使用for/in生成的查询,我更新了问题。我对代码进行了更改。学习笔记和代码以理解。非常感谢您的详细解释。这很有帮助!