2015-04-17 34 views
2

我正在学习流星(我是一个noob虽然),并希望基于一个变量的更改更新集合中的多个记录。流星collection.update使用数据从文档更新

集合中有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

出于演示的目的,创建一个样本采集测试设置:

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; 

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

var queryList = []; 
db.collection.find().forEach(function(doc){ 
    var obj = {}; 
    obj["data1"] = doc.data1; 
    obj["data2"] = doc.data2; 
    queryList.push(obj); 
}); 

下一步是使用$set运营商使用forEach在查询列表数组进行迭代,并做了更新:​​

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(); 

结果

/* 0 */ 
{ 
    "_id" : ObjectId("5530d9f0180e849972938fd7"), 
    "data1" : 158000, 
    "data2" : 0.25, 
    "data3" : 300000, 
    "data4" : 142000, 
    "data5" : 35500 
} 

/* 1 */ 
{ 
    "_id" : ObjectId("5530d9f0180e849972938fd8"), 
    "data1" : 200000, 
    "data2" : 0.5, 
    "data3" : 300000, 
    "data4" : 100000, 
    "data5" : 50000 
} 

/* 2 */ 
{ 
    "_id" : ObjectId("5530d9f0180e849972938fd9"), 
    "data1" : 208000, 
    "data2" : 0.75, 
    "data3" : 300000, 
    "data4" : 92000, 
    "data5" : 69000 
} 
+1

对不起,延迟回复。上述解决方案经过我需要的轻微修改后,可以完美运行非常感谢您花时间帮助我。 – balu000

+0

@ balu000不用担心:-) – chridam