Meteor collection.update foreach使用来自文档的数据进行更新

时间:2015-04-17 08:36:53

标签: mongodb meteor foreach

我正在学习Meteor(虽然我是一个菜鸟),并希望根据一个变量的变化更新集合中的多个记录。

集合中有15个文档,每个文档有2个固定值(称为data1和data2),data3是一个周期性变化的变量,还有许多其他字段基于这三个参数计算。

我知道语法很糟糕,我只想展示我想要实现的目标:

Collection.update(
{data1: 158000},
{
data1: 158000,
data2: 0.25,
data3: variable1,
data4: variable1 - data1,
data5: data4*data2
etc...}

Collection.update(
{data1: 200000},
{
data1: 200000,
data2: 0.5,
data3: variable1,
data4: variable1 - data1,
data5: data4*data2
etc...}

etc...

所以基本上我想为集合中的每个文档都有一个更新函数,我需要能够根据每个集合中的数据计算要更新的值,并将一个变量传递给整个集合。功能。感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

出于演示目的,创建用于测试的样本集合集:

db.collection.insert([
    { "data1": 158000, "data2": 0.25 },
    { "data1": 200000, "data2": 0.5 },
    { "data1": 208000, "data2": 0.75 }
]);

根据查询创建包含要更新的更新查询和派生对象的对象列表:

var queryList = [
        { "data1": 158000, "data2": 0.25 },
        { "data1": 200000, "data2": 0.5 },
        { "data1": 208000, "data2": 0.75 }
    ],
    updateList = [],
    query = {},
    obj = {},
    update = { "$set": {} },        
    variable1 = 300000; 

如果您想查询每个文档并且事先不知道密钥,可以使用updateList游标动态生成Collection.find()数组,并使用{{1}遍历游标方法如:

forEach

下一步是使用var queryList = []; db.collection.find().forEach(function(doc){ var obj = {}; obj["data1"] = doc.data1; obj["data2"] = doc.data2; queryList.push(obj); }); 迭代查询列表数组,并使用forEach运算符进行更新:

$set

最后查询集合中的所有文档以显示更新:

queryList.forEach(function (item){
    obj["data1"] = item["data1"];
    obj["data2"] = item["data2"];
    obj["data3"] = variable1;
    obj["data4"] = variable1 - item["data1"];
    obj["data5"] = obj["data4"] * item["data2"];

    query["data1"] = item["data1"];
    update["$set"] = obj;

    db.collection.update(query, update);
});

<强>结果

db.collection.find();