forEach如何将多个数据保存到MondoDB中

时间:2019-01-06 21:42:48

标签: arrays node.js mongodb stripe-payments

我有一个基于Stripe和MERN堆栈的应用程序。我的问题是,当我命中端点以获取费用然后console.log结果时,我看到了一系列费用。哪个好因此,我决定使用forEach遍历它们并提取amount的值。这行得通。

但是..

router.get('/all', (req, res) => {
    stripe.charges.list({
        limit: 3
    }).then(charges => {
        charges.data.forEach(charge => {
            return newData = new Charge({
                amount: charge.amount,
            })
        });
        newData
            .save()
            .then(charge => {
                res.json(charge)
            })
            .catch(err => console.log(err))
    })
})

当我基于模型在forEach中使用var count = 0; $("#add_destination").on("click", function(e) { e.preventDefault(); count = Math.floor(Math.random() * 78955) + 147; if ($('[name="added_dest').is(':empty')) { alert('empty detected'); } else { alert('not empty'); } $("#desti_div").append("<div class='tmar'><div class='form-group col-md-6 getspace'><label><i class='gicon fas fa-circle'></i> New Destination</label><input class='form-control input-lg form-field' type='text' id='added_dest" + count + "' name='added_dest' placeholder='New Destinaton' ><a href='' class='gored'><span class='form-control-feedback'></span>Delete</a></div><br/></div>"); }); $(document).on('click', '.gored', function(e) { e.preventDefault(); field_val = $(this).siblings('[name="added_dest"]').val(); alert(field_val); $(this).parent().parent().remove(); });在MongoDB中创建记录时,即使阵列中至少有3个电荷,我也只能在数据库中保存一条记录。我该如何解决?

谢谢

3 个答案:

答案 0 :(得分:1)

您最好使用一个操作而不是多个操作。 为此:Model.insertMany方法。 https://mongoosejs.com/docs/api.html#model_Model.insertMany

伪代码:

const dataForSaving = charges.data.map((charge) => {
  return {
    amount: charge.amount,
  };
});

Collection.insertMany(dataForSaving, (err, docs) => {
  if (err) {
    throw new Error(err);
  }

  console.log(docs);
});

答案 1 :(得分:1)

累积将每个新的Charge对象保存在数组中并用Promise.all()执行它们的承诺。

router.get('/all', (req, res) => {
    stripe.charges.list({
        limit: 3
    }).then(charges => {
        let promises = charges.data.map(charge => {
            let newData = new Charge({ amount: charge.amount })
            return newData.save()
        });
        return Promise.all(promises);
    }).then(result => {
        res.json(result);
    }).catch(err => {
        console.log(err);
        res.error(err);
    });
});

编辑-同样的想法可以应用于更详尽的承诺,例如基于另一个异步查询有条件地保存的承诺。轮廓看起来像这样……

function maybeSave(newData) {
    return db.find(/*a query based on newData */).then(result => {
        return (result)? Promise.resolve() : newData.save();
    });
}

        // and in the loop gathering promises...
        let promises = charges.data.map(charge => {
            let newData = new Charge({ amount: charge.amount })
            return maybeSave(newData);
        });

答案 2 :(得分:1)

var charges = ['a', 'b', 'c'];

charges.forEach(function(data) {
db.insertMany(data,function(err,result)){
console.log(result)
}

  // SAVE DB
});

它适用于保存到数据库的数组中的每个记录