从循环内更新数据

时间:2017-06-20 19:24:42

标签: javascript node.js mongodb mongoose

我正在尝试让我的nodejs控制器更新货币表中的费率

在S3T / RoboMongo中一切正常,但由于某种原因,它只是不会在nodejs控制器中触发更新。

这是我的货币

{ 
    "_id" : "USD", 
    "index" : NumberInt(6), 
    "name" : "Dollar", 
    "currency" : "USD", 
    "symbol" : "$", 
    "active" : true, 
    "default" : false,
    "rate" : 0
}
{ 
    "_id" : "EUR", 
    "index" : NumberInt(2), 
    "name" : "Euro", 
    "currency" : "EUR", 
    "symbol" : "€", 
    "active" : true, 
    "default" : false,
    "rate" : 0  
}

我尝试了这两种方法,在S3T中工作正常但在nodejs中没有工作:

db.currency.update (
    { _id : "EUR" },
    { $set: { rate : 123 }},
    { upsert: true }
)

db.currency.updateOne (
    { _id : "EUR" },
    { $set: { rate : 123 }},
    { upsert: true }
)

这是我的nodejs代码:

var mongoose = require('mongoose');
var currencyModel = require('../models/currencyModel');
var currencyTable = mongoose.model('currencyModel');
var updateRates = () => {
    return new Promise((resolve, reject) => {
        for (var key in data.quotes) {
            var currencyID = key.substring(3);
            var newRate = (data.quotes[key] * THBUSD).toFixed(5);
            console.log("currencyID: " + currencyID)
            console.log("newRate: " + newRate)

            currencyTable.update (
                { _id: currencyID },
                { $set: { rate : newRate }},
                { upsert: true }                    
            ),function (err, data) {
                if (err) {
                    reject(new Error('updateRates: ' + err));
                };
            };                      
        };
       resolve();
   })};

这是我的currencyModel(我觉得问题出在哪里?!?)

// Currency Model
// This model is the structure containing data from the Currency table 
//
var mongoose = require('mongoose');
var Schema = mongoose.Schema;
var currencySchema = new Schema({
    _id:                String,     // Unique Currency code
    index:              Number,     // Indes for sorting
    name:               String,     // Currency name 
    symbol:             String,     // Currency symbol 
    active:             Boolean,    // Active True False
    rate:               Number      // Exchange rate (multiply with THB price)
});
module.exports = mongoose.model('currencyModel', currencySchema, 'currency');

我无法理解为什么它不会从nodejs内部触发currencyTable.update。

我在mongoose中启用了调试,我在控制台中看到了所有其他mongodb操作,如Mongoose: price.findOne({ _id: 'ATL-D406' }, { fields: {} })等。但我在控制台中看不到这个currency.update,这就是为什么我不这么认为它向mongodb发射 - 我看不出原因。

1 个答案:

答案 0 :(得分:1)

你有一个"循环"在内部回调触发之前完成执行。相反,只需使用Promise并调用Promise.all()来收集所有迭代的Promise并解决它们:

var updaterates = () => {
  return Promise.all(
    Object.keys(data.quotes).map(k => {
      return currencyTable.update(
        { _id: k.substring(0,3) },
        { $set: { rate : (data.quotes[k] * THBUSD).toFixed(5) }},
        { upsert: true }        
      ).exec()
    });
  )
};

Promise.all()的返回响应是来自更新的响应对象的数组。另请注意,这是一个快速失败的问题"操作和通话将同时进行。

Object.keys()返回一个"键名称数组"在指定的对象中。 .map()迭代这些键并返回一个"数组"迭代器的return值。

我们使用k作为"键名"要从data.quotes访问所需的密钥,并使用这些值与.update()执行每个.exec(),以返回"真实" Promise。迭代器返回一个"数组" Promise成为Promise.all()的参数。